Java StarLogo 2.0 english `turtle` TO GO ;-------------------------------------------------------------------------------------------- seti 0 ; initializes variables used in finding neighbors setdistance_1 1000 setdistance_2 1000 setdistance_3 1000 ; (below) determines ID numbers and distances for three closest neighbors; each turtle is ; first checked to be visible (i.e., out of blind spot and in front of obstacles), and then ; its distance is compared with that of neighbor_3. If a bird is closer than neighbor_3, ; it is then compared with neighbor_2 and (if it's closer than neighbor_2) with neighbor_1; ; variables are then re-assigned to accomodate the new neighbor as one of the closest three. repeat count-turtles [ifelse not ((i = who) or in_blind_spot? or behind_opaque_obstacle?) [setdist distance-nowrap xcor-of i ycor-of i ifelse dist < distance_3 [ifelse dist < distance_2 [setneighbor_3 neighbor_2 setdistance_3 distance_2 ifelse dist < distance_1 [setneighbor_2 neighbor_1 setdistance_2 distance_1 setneighbor_1 i setdistance_1 dist] [setneighbor_2 i setdistance_2 dist repeat 2 [fd 0]]] ; (see note at end for explanantion of "fd 0") [setneighbor_3 i setdistance_3 dist repeat 4 [fd 0]]] [repeat 6 [fd 0]]] [repeat 7 [fd 0]] seti i + 1] setacceleration 0 ; sets acceleration to zero settarget_1 calc_target neighbor_1 distance_1 ; calculates targets (see procedure below) based on settarget_2 calc_target neighbor_2 distance_2 ; the headings and positions of each neighbor; settarget_3 calc_target neighbor_3 distance_3 ; acceleration is set by the calc_target procedure ; (below) calculates a bird's composite target, weighting each individual target by the inverse ; of distance to that neighbor settarget atan ((sin target_1) * 100 / distance_1 + (sin target_2) * 100 / distance_2 + (sin target_3) * 100 / distance_3) ((cos target_1) * 100 / distance_1 + (cos target_2) * 100 / distance_2 + (cos target_3) * 100 / distance_3) ; (below) turns bird towards target by a fraction specified by "flexibility"; random motion is also ; included to an extent governed by "noise". The "... + 540) mod 360) - 180" clause is necessary to ; ensure that the bird turns in the right direction. For example, if a bird is oriented at 0 degrees ; and its target is 300 degrees, it should consider a 60 [ = ((0 - 300 + 540) mod 360) - 180] degree ; turn to the left instead of a 300 [ = 300 - 0] degree turn to the right. lt (flexibility / 100 * (((heading - target + 540) mod 360) - 180)) + (random noise) - (random noise) scale-color red (abs (heading - 180)) 0 180 ; colors turtles according to new heading ifelse ((pc-at dx dy) = green) ; "bounces" birds off of obstacles as light would [ifelse ((pc-at 0 dy) = green) ; reflect off of a mirror [seth 180 - heading ifelse ((pc-at dx 0) = green) [seth 360 - heading] [fd 0]] ; (see note at end for explanantion of "fd 0") [fd 0 ifelse ((pc-at dx 0) = green) [seth 360 - heading] [ifelse (abs cos heading) > (abs sin heading) [seth 360 - heading] [seth 180 - heading]]]] [repeat 2 [fd 0]] fd 1 + acceleration ; moves birds forward end TO CALC_TARGET :neighbor :distance ;--------------------------------------------------------------- ; (below) calculates target by rules described in information window; please see note at end ; for an explanation of "fd 0" ifelse :distance < repel_range [fd 0 output 180 + towards-nowrap xcor-of :neighbor ycor-of :neighbor] [ifelse :distance < dir_range [fd 0 output heading-of :neighbor] [ifelse :distance < pos_range [ifelse (abs ((((heading - towards-nowrap xcor-of :neighbor ycor-of :neighbor) + 540) mod 360) - 180)) < 90 [setacceleration acceleration + 0.3] [setacceleration acceleration - 0.3] output towards-nowrap xcor-of :neighbor ycor-of :neighbor] [fd 0 output heading]]] end TO BEHIND_OPAQUE_OBSTACLE? ;----------------------------------------------------------------------- if not obstacles_opaque? [output false] ; procedure ends and returns "false" if obstacles ; are not currently opaque setvis_x (xcor-of i) - xcor ; sets variables described above setvis_y (ycor-of i) - ycor setvis_step max abs vis_x abs vis_y setvis_x_inc vis_x / vis_step setvis_y_inc vis_y / vis_step repeat vis_step ; checks the patches between a neighbor and the [if (pc-at vis_x vis_y) = black ; bird in question, stopping on a patch that is [setvis_x vis_x - vis_x_inc ; an obstacle setvis_y vis_y - vis_y_inc]] ; (below) returns "false" if all patches between ; birds were checked, but returns "true" if the ; checker got stuck on an obstacle between birds output not (((round vis_x) = 0) and ((round vis_y) = 0)) end TO IN_BLIND_SPOT? ;-------------------------------------------------------------------------------- ; (below) compares bird's heading with direction to a neighbor to see if it falls within the ; blind spot output (abs ((((heading - towards-nowrap xcor-of i ycor-of i) + 360) mod 360) - 180)) < (w / 2) end `observer` globals [w ; width (in degrees) of blind spot behind bird obstacles_opaque?] ; whether or not a bird is unaware of neighbors ; that are hidden behind obstacles turtles-own [neighbor_1 neighbor_2 neighbor_3 ; ID number of closest neighbors distance_1 distance_2 distance_3 ; distance to closest neighbors target_1 target_2 target_3 ; preferred heading considering each neighbor -alone- target ; preferred heading considering all three neighbors i ; counter for selecting neighbors dist ; distance from a bird to the one in question acceleration ; extra distance to move forward in a time step vis_x ; x-counter when testing for obstacles vis_y ; y-counter when testing for obstalces vis_x_inc ; increment to vis_x when testing for obstacles vis_y_inc ; increment to vis_y when testing for obstacles vis_step] ; number of patches needing to be tested for obstacles TO RESET_BOARD ;----------------------------------------------------------------------------------- ask-patches [ ifelse ((abs xcor) = screen-half-width) or ((abs ycor) = screen-half-height) [setpc green] ; colors patches green on edge of screen [setpc black] ; colors all other patches black ] end TO RESET_BIRDS ;----------------------------------------------------------------------------------- setw 30 ; sets width of blind spot obstacles_transparent ; calls procedure to make obstacles transparent ; to birds clear-turtles ; kills turtles crt number ; creates turtles and assigns them random positions ask-turtles [ setshape bird setxy ((random screen-width) - screen-half-width) ((random screen-height) - screen-half-height) ; and headings seth random 360 scale-color red (abs (heading - 180)) 0 180 ; colors turtles according to their headings repeat 1000 [if pc = green ; randomly moves turtles that are in obstacles [setxy ((random screen-width) - screen-half-width) ((random screen-height) - screen-half-height)]] ] end TO OBSTACLES_TRANSPARENT ;------------------------------------------------------------------------- setobstacles_opaque? false ; sets "obstacles_opaque?" false end TO OBSTACLES_OPAQUE ;------------------------------------------------------------------------------ setobstacles_opaque? true ; sets "obstacles_opaque?" true end `information` WHAT IS IT? ------------ This project is an attempt to simulate the coordinated motion of a group of individuals such as fish in a school, or birds in a flock. Each bird follows a simple rule, and the flock as a whole moves without any leader. A bird adjusts its flight based on the position and/or heading of its three nearest neighbors; this adjustment is partitioned into three zones: 1) Repel range. A bird moves away from neighbors that are too close. 2) Direction range. A bird aligns with neighbors that are a comfortable distance away (i.e., it attempts to match the neighbor's heading.) 3) Position range. A bird moves towards neighbors that are far away. A bird adjusts its heading towards a vector sum of the "target" headings that these would imply for each neighbor; the influences of birds are weighted by the inverse of distance, such that close birds are more influential than distant ones. In addition, a bird will accelerate slightly for each neighbor in front of it and in the position range; it will decelerate slightly for each neighbor that is behind it and in the position range. This allows trailing birds to catch up with the flock and leading birds to slow down without turning around. All birds also have a blind spot (the default is 30 degrees) directly behind them, in which they cannot sense the presence of other birds. For the sake of simplicity, birds reflect off of obstacles as light would reflect off of a mirror. Though this is not necessarily realistic, it adds variety to the simulation by forcing the birds to continually adapt the flocking structure to outside influences. HOW TO USE IT ------------- The RESET_BOARD button erases all obstacles that have been drawn and restores the edge boundary. The RESET_TURTLES button creates the specified number of birds and places them in black cells on the board. The GO button executes the flocking rules described above; one button executes a step at a time and the other runs continuously. The OBSTACLES_TRANSPARENT and OBSTACLES_OPAQUE buttons toggle the way birds perceive obstacles in the middle of the screen. After selecting obstacles_transparent (which is done by default in the reset_turtles procedure), birds can still see neighbors that are on the opposite side of an obstruction. Selecting obstacles_opaque causes obstacles to block the birds' line of sight and hide neighbors that are behind obstacles. While it is clearly more realistic to have obstacles be opaque, this slows down the simulation immensely and is recommended only for careful examination of the birds' behavior around obstacles. Also, the step by step go button should be used when obstacles are opaque, because no attempt is made to synchronize the turtles' execution of commands when they are looking for obstacles. The NUMBER slider sets the number of birds in the simulation. The REPEL_RANGE, DIR_RANGE, and POS_RANGE sliders control the outer limits of each of these zones. The relative sizes must be maintained for the program to function properly (i.e. repel_range < dir_range < pos_range.) The NOISE slider determines the maximum random adjustment that a bird could make to its heading in a single time step. The FLEXIBILITY slider controls how completely a bird adjusts its heading to the calculated target. A flexibility of zero would cause a bird to maintain straight-line motion (excluding walls and random turns), while a flexibility of 100 represents instantaneous adjustment to the influences of the three closest neighbors. THINGS TO NOTICE ---------------- Obstacles can easily be created in the center of the screen by using StarLogo's painting capabilities; the flock remains quite cohesive when confronted with various shapes and sizes of obstacles. Cohesiveness is affected by the parameters, in particular flexibility and noise. CREDITS ------- Modified for Starlogo 2.0.2 by B. MacLennan, October 2003, from original version by William Thies on Scott Camazine's website. `interface` SLCanvas top-left 5 287 SLSlider top-left 120 50 width-height 140 25 name "number of birds" variable "number" min-value 0 max-value 50 current-value 20 slider-number 7 show-name? true toolTip-text "set number of birds" SLSlider top-left 160 60 width-height 114 25 name "repel range" variable "repel_range" min-value 0 max-value 10 current-value 3 slider-number 2 show-name? true toolTip-text "set outer range of repel zone" SLSlider top-left 200 40 width-height 152 25 name "direction range" variable "dir_range" min-value 0 max-value 100 current-value 7 slider-number 6 show-name? true toolTip-text "set outer range of zone of comfortable distance" SLSlider top-left 240 50 width-height 130 25 name "position range" variable "pos_range" min-value 0 max-value 50 current-value 25 slider-number 3 show-name? true toolTip-text "set outer range of position (attraction) range" SLSlider top-left 280 60 width-height 116 25 name "flexibility" variable "flexibility" min-value 0 max-value 100 current-value 40 slider-number 4 show-name? true toolTip-text "how completely bird adjusts to neighbors" SLSlider top-left 320 80 width-height 78 25 name "noise" variable "noise" min-value 0 max-value 20 current-value 5 slider-number 5 show-name? true toolTip-text "maximum random change in heading per timestep" SLButton turtle-or-observer? turtle top-left 20 160 width-height 56 30 name "go once" line-to-run "go" forever? false button-number 2 show-name? true whichip 9 toolTip-text "do one cycle of simulation" SLButton turtle-or-observer? observer top-left 360 60 width-height 111 30 name "obstacles opaque" line-to-run "obstacles_opaque" forever? false button-number 5 show-name? true whichip 12 toolTip-text "obstacles are treated as opaque" SLButton turtle-or-observer? turtle top-left 20 30 width-height 59 30 name "cycle" line-to-run "go" forever? true button-number 1 show-name? true whichip 8 toolTip-text "start/stop continuous simulation" SLButton turtle-or-observer? observer top-left 410 20 width-height 192 30 name "obstacles transparent (default)" line-to-run "obstacles_transparent" forever? false button-number 6 show-name? true whichip 13 toolTip-text "treat obstacles as transparent" SLButton turtle-or-observer? observer top-left 70 30 width-height 77 30 name "reset board" line-to-run "reset_board" forever? false button-number 3 show-name? true whichip 10 toolTip-text "clear board" SLButton turtle-or-observer? observer top-left 70 150 width-height 72 30 name "reset birds" line-to-run "reset_birds" forever? false button-number 4 show-name? true whichip 11 toolTip-text "create new population of random birds" `turtle shapes` H4sIAAAAAAAAAO3c25Mk113g8UQ2IIzAXu5gWHJhuSOQRtJI4rL0k182/LoPGzxY ggE5wthGkoPYfao/lD+A/wKcZXXVzFFX5e2cPLfPJ4L6UtmddfKXU93TMx6d4evf +fxHn37+vRfjZ5989MMXn33n4fXh0cP58Y2ffPzN88enAz/14//7yo//7/XLp9Cz 0/Twnz8WNjx26/Ninb/mtZ96vb3nL32dvXMUOP83fvJtAQDoz2vnx7U/R5TQtT+j pVr36Os4av1br7t0/a3XlfrXMNd1xPp1OGpd6/e9/t51t15H7HVjXcfS65s7v8CO w/DVAQAAAAAAAABowU/+O6JC/k2CdtC5z8l9feY/dt7W74f5zd/S/GuvN/b8ue9X b/OnvJdH1Px9vR9Sr5F7vtzzl3Y/ct9z85vf/OY3v/nNb/7W5889b+77kXu+o+fP PU/u+5H7+nPPv/Z+xL5/e9c3v+rd/tTwxmf/+qOPPr1uH3reJtD2oTw6FfJW1Uwd bB8KAB17LfvPIqqqqnp8B9uHAgAAAAAAAEBDXs/+bxFUVVVVVVVVVVVVVVVVVVV1 f4dpQ6A3fvji089+8P3L9qGvTfsE2j6UR6fp4am30BNvp7uft/b8iG/zXdcf+/yt 17v0fm693jsft30oAHTrtfPjnp+R9v7MlXv9rT+rbV2/9PN769pzYr+e9ctef+9r tLZ+7M8vbf2997PC80fbhwIAAAAAAABAK14/P+75txpz3fsaqa/P/Obvef7U6+ee 3/rWt37a7yGqWmdTr1H69Znf/OY3v/nNb/7j56v9/pjf/OZPd33mN7/5882/9zWs b33rF73+V4Zf+PzFp//y3c9fXPYP/UqT+4c+fP30Std+vPb1dzhND3vfi0ve30ec /7J7H7v3enu+7nKvv/H+2T8UCrX3946Cf+9ZxPynJ5vqPHq1fv/Q3hvrZ7XY66a+ jtzr577/OdZ/2Z5zY1xXjl//kuZfeh9irbN1hntq+/W3/iHvv9H+oQAAANxy639r OOp/c8i9PvQs99df7vWhZ3Nff7G/Ho9eDwCgfen3D1XVfrv3NXJff665a70PqdfI PZ/5zW/+4+9D7nly3Yfc129+7/+nruWWnGuXcJ+OmD/3r7/5+57/npxrl3B/evj1 z3Efcs+T6z7kvv5b17TUkWvFWtOvf/65a70PqdfIPZ/5zW9+8x99H3LPk+s+HHCd Xx1+6XH/0H/7wQ/+8bKJ6FfvbiL68K2/v9s5e8/fKvcmnrnX3+E0PTz1Br1nyRt8 z/lPfZGtXXfJNW354i55/Y33b9EmonNf26m/9ntfnz7ZRPP0So8+PzebiHKMZZuI 7rXzDzbdr7/kZ8StPzPWsv7S60i1bo71X7bn3BjXlePXv6T5l96HWOtsneGe2n79 rX/I+2+MsYno3j8r1/5nbfObP2dzM3/f8wMA7cu9iVfu9aFnub/+cq8PPbOJKABA 7eJsIppbin9zsaa5md/8OZub+fPO/3KPuNclzGl+85vf/Efdh9zz5LoPua8/19wl 34d7cq5dwn06Yv7cv/7m73v+e3KuXcL96eHXP8d9yD1PrvuQ+/pvXdNSR64Va80S ft1reB8cMXdt98H85je/+XudP9V9yD1PrvtwwHX+9PDGpx99/PF3P79sH/rT97cP ffxnl9/5nVee3/LwzeHJz7v1/PHz517nS71x3s3zbzyPff7l81Y2PH/u9W59/i0P 3/6PZZ+4cvvQe2/l8HNuPb/3ekstuY4jz99qzb269/lz88x83rLtQ8OvycfvEcH3 is3b/N16z6/8p+K3ruPW69/6+N51b30P27r+lz5/5cfn1r95PZHmXquY9W9dx8qP W3/n+rd+j547vnL9rb+nr/29/+h1137/iXVdc6+/9eOx5lvqS+t88TPWpTtff/X1 BOvvl2b70C1/LHrq/L3mXj/WOmutWX/pvVozS+xf773rWd/6JayfWq51567j1sdj rbN1/a3Xsfb1Y78v1r7+3uvZ+XpjjO1DH8X+M3QtFs/1nd/9ok//HUru+7D4zy5r fz0vc99opPdFqj8DfunzY/9d0c75t/4ZdOn5yf6OLPLfsSWbP/ecO+/DnFjzf+l1 976vD5r/st7O+7D5+reeH2nuy3q1fR1Env+W0udPrbj3wdF/95b76+Kg9/ktu+dP fH5q5l/Y2PNH+vluL/MvrPmfbi/z35on9ueb/5XGtnrewrpV7uvOfR9yX2+u+XNf Z+77MP86D0Fzz7XueuYsXW/556ft9Toegt7//Fu23r/j3g8PSa5/7nXmP/9h0fqp 5996/bEsnuPb//5qI38fz23x3AvvQyvm5u9FuXPH2T4097/hyd3Ucs2Ra945sf+N zNr1ctt7/aXNk5r508+/9zVT/poc8X28xPlL+33saKl+XyxNrDnNb/6nWjrzmz9l S2d+86ds6czf17xzep07ZP4+5w6ZP878pdyvrde9df5S3jexr3/udUr7uol9/bX8 vHDUHKXdh9zzHHVfcl9frvuQ+3q+6M8Mv/i9F//0+Zv/8NGnlw1Ef2b6+M0NRPd6 +D/bXvLxvK3ns9lpenj5jXPvTb7mC2Lrx5auNXe9tfTW/HP3J+LHF20gSllyfa/M 9b06XPeo9W+t6/cqoB3LNhDVsprqc5e8Vo71n5Lynt1bd+9Mc59z1HtIdfjCvY+9 bMtrbzl/TuvnH3z/x5gbiALAy3r/O7Re5+/171B7/TvkublbnX/p3K3Nv3buVubf Oncr8wMAAABQm7gbiKqqqr7cl8V4rdzz5Jy/pvvwlB7mvyfFWrnnXTJ36mstfe6j rrHUuXNcW0lzHz1/7Ptw9HWXcn9yX1+u+XNfl6qqqqbr1nPuOeKac6y/Vivr72V9 61u/3vW3XkesdUtZf+l1pFo30fo/O3z90+/+8yev7iD6s9MnJNtB9Ja9/6WM/+Im mdP08NQ76N679N47b8m7e8159746lpxXeu/NOHcPIn3cDqINyf09Mvf36tz/lab/ WhSojx1ES+/Sz31Z7vVjXMfac+5Jue6S9e9dR8xfq6XXmXN9LatzH3vZltfecv6c 1s8/+P6PdhAFoBS9/x2a+R+ebC96/zvl3ndi7H1Hyt535rRDKQAAAABx2UFUVVXj dO9rPKWEuVLPbf7b85d8H2K/5hItzr1m/pz3IfUaW7Qw9575U96Ho+aOMf+W+3D0 fEfex57nX3ofcl9f7vuQ+7pUVVVzdOs59xxxzTnWX6uV9feyvvWtX+/6W68j1rql rL/0OlKtm2j914evffZvH33/snno+R8FbN489OH31p7x6nmXPl/2eXPHb77+TLee F6tbr39OeF9v3eeXnKaHrW/SWG/uuc+bO773m0guW69/7a/PzHldbB669msp1bpz 3wOPXj/1dcS+72u/N+5dP/b39lTrrv09LtW6tf5eXMvPAKnWT309W+Va90vXMfN9 Mvn30Znv1/u/n792fkz9B5zcDeVa9+jrWKqW+772+veuv1as9feKdb9Sy7Vu7vVL ue9HvQ9Sf/+Kve6t69j68djf9yJ/nxttHkrtjvozQWmO/jNRKVb/2fCgv/s6ivlX 9vn91sb899u60udP/Xd2pc5fyt/Vppb776zNv+28rY6ad+k8R/9vArnnD+dI9X1l 7+vX0jm5r6/U7yutNJT7esx/TG/JfV3mT9ulcl9n7vlDua/7qDnn5J4r19y39DZv qPf5Q3v/PrH6v480/92mPj+3+ue3eajW3zm5ry/X3K3Ov1fu6zd/3vlrvx/mb2ue 1uZfq5X5Yyl9/qOYv4z5c9t7PbXP/2jv9dQ2byrm73PuR73O/ajX+b3v+5y/99/3 av+5Z6nYP/fWch9SzV3q/Th6XvOvux9Hn5+75r8v9fm5W/n8Pze88eL7/////cuL y/ahPzftE3jZPvThf39+voyHb32yqKHH8+csPX/v+uHnbT0/1vyz93Xh/bv5uo+/ fhs7fLF96Fq33uZLvxzmju9df+71Uq+/9tvA3Pl7X3fGefvQL71HvvX3UTuntPX3 am393Pe/tPXXXl9r6+e+/6V9/e/+PlX5+ruvt7D1e+vj9qGpHfQzTbT1Y/8Rsvb1 92pt/bXX19r6a9W+/trzU19vaevHvt7c63dmnLYPnf2ZIfKfzY/+s/4c85v/bguZ M9f8uZnf/Pe6+/XNf7d7r6/173/mN3/O7pV6/r3nm9/8e15/dn3z3+3s+b7/Ze1e 5jf/vaaW+/6Z3/z3mlrv86dmfvPfrflVtdM+bh9au97/bYj5zb+nqV+/9Oszv/nN v/31czO/+fd07+vnVvr8qe+f+c2/p6mvv/f5UzO/+fd07+vnlnv+1OvnZn7zp2zp Us9f+v3Nff3mN3/O+YFmfW342ifPfvDssnno117ZPPTxsx7e/OErDfXy8Tlznxeu M7vu//2LJ7v08/aeP3yxeeit30zmfrNp9eNLf9Pd+pvy0s/f+5v9wvPPm4eG1r6X ne9857d7/l61rT93/trulXr9vT9j7H096+dd/3Hz0L0/yzjf+c5v9/y5z4/9ernX X3s/58S+/tjr534962ddf5w2D53T+s/C1re+9a1vfetb3/rWt771rW9961s//evv ZX7z32vpr79X7uvb+/0p9/e3vcxv/pzdff2Z/+1C7uszv/lTdq/c129+8+/pXrmv v/X5HzcPzf1vUaxvfetb3/rWt771rW9961vf+ta3fvnr73390q/P/Obvef6966dW +v1Pzfzm39Pery8185t/T2tnfvPvae0Kn//nhzc+/tHHH3/vxWX70J9/cvvQRw/f vN9b5s679Tpf+vi3/+PVrnzd3ecf3EdbzwttOO80Pax9W8Z6O7fybWCvvfdv56/f N57aPjQU672+1dHrH/W1X8r6q7+3Hv291vp519emGzp6vdLWj309e6Vf/+ntQ2P/ kSX3H5kK+yNacesD/cr9/ae09XP//nPw+uOS7UPnlPaz7NHMn7e5tT5/7vly35/c 12/+fd0r9/Wnnn/3OnN/V9n632Wa3/zmN7/5zd/j/Kqqqlpd5+S+vtTzzcl9/ebf 171yX3/u+ee0Pt8c8+dtbvXPv2z70Nz/dmPO3us3v/n3NLfW59vL/Obf09q1Ph8A AAAwr/W/H/D3P+bf09rtnb/0+5N6PvOb/15z23n9bwxf/fi7n/7j9P/d3TaU7pym h6feNk99Cdx7m235kopxfoov9Xvzb53n1sdj3f8d5y/aNhQAaNGybUNT/KwSa91S ruOo1186/9brS33vSl0/9bpz17H387a+buz7tPf+zn1OqvOXXFuM9cPXWfr5sdff 2t7Xv3UdudaNcB1jjG1DAQAAAAAAAIASxNk2tKZ/S5G7Cf4tRxVde07u6zW/97/5 vf/XzpN6/tz3a+31711z67q55i6lvc4d+z7kvv5c829d56h5Ut+Hva971K9j7Plz vV4p1x3reo6ef+/1x76OXPNvnSf2+nvvQ+p1j5o79/xr14+9binzz11HqvVKmz+8 ntTrlDr/0TW/+c1v/l7nX3ofcl+f+c2fY+5W78PauTLch18YXv/sk49++OLNt985 PxtsHcrVaXoo4Uspdvd+qWX4Us1VW4cCQLe2bx2qqvkaHuttfVWN0tHWoQAAAAAA AADQinxbh6qqqqqqqqr20PBY7usxv6qqqqqqqmrT/cXL1qHvnp8Ntg7l6jQ9FPJW jdrw2NHnV1RbhwJAt2wdqlpjw2O9ra+qUTraOhQAAAAAAAAAWmHrUFVVVVVVVdWU DY/lvh7zq6qqqqqqqjbdr1+2Dn3v/GywdShXp+mhkLdq1IbHjj6/oto6FAC6ZetQ 1RobHuttfVWN0tHWoQAAAAAAAADQCluHqqqqqqqqqqZseCz39ZhfVVVVVVVVtel+ 47J16PPzs8HWoVydpodC3qpRGx47+vyKautQAOiWrUNVa2x4rLf1VTVKR1uHAgAA AAAAAEArbB2qqqqqqqqqmrLhsdzXY35VVVVVVVXVpvvfLluHvn9+Ntg6lKvT9FDI WzVqw2NHn19RbR0KAN2ydahqjQ2P9ba+qkbpaOtQAAAAAAAAAGiFrUNVVVVVVVVV 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 `settings` patch-size 8 num-shapes 64 screen-half-width 25 screen-half-height 25 interface-window-xcor 304 interface-window-ycor 30 interface-window-size 700 493 output-window-xcor 0 output-window-ycor 22 output-window-width 300 output-window-height 200 info-window-xcor 0 info-window-ycor 22 info-window-width 500 info-window-height 400 control-center-xcor 0 control-center-ycor 85 control-center-width 860 control-center-height 651 turtle-command-center-height 150 observer-command-center-height 150 `string table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `symbol table` H4sIAAAAAAAAAGNgYGBiYE1LzClOZWApKSpNBQDlw1heEQAAAAAAABE= `double table` H4sIAAAAAAAAAGNgYBB28G5gAAEHDQYIrQeh7T9A+SpQmgNKC0BpESitBqUZoLQE lJaB0gpQWglq7mVjMHDQgorrQGlDKG0AoQG5y/otnAAAAAAAAJw= `list table` H4sIAAAAAAAAAI1SSW7DMAwkJSuO7cRZAAMBWrT/6rmH3vq5PCrPCIcceckpOoij ITWkSIlIJyIp2abiazD7pXFujVcV/TOb7HwnbzY/UsSnjE0kEyvxvwbfMLbQ7mhb 8/eqk9BCvzd+r1FDobX7rtkB8x74TH3YHLqmE/UNkc/1Ms/wJ/p76g3Ua8jv6rtr HHM3zKXkkc99rGmgdjF8oM4va2yJobEnLu/EmNaRHM5Wb/rELDiHwpjNXOoc0zyn iv2e6MYPbtarvcGbDgZvK+7uc4oZRY90+vDaZ35T2w80LMfIni140cH6Rr4cenUu p9VfOGv0AHcvxBe+eSS+6uIbWS/wybWCO6+0pMYJevry/156Ap9/8ycCXm+IKAMA AAAAAyg= `bytecodes` H4sIAAAAAAAAAI1XW0MaRxSegV1QUFgNC6JoaDSp6S29pLf0EsHQaGvUKGnTKyIQ k8ZKCviQl773tX+nf6H9J/0RnZ05M/vtsBJ5YGa++c5lzpzZM8OyR8cvR71Ov9sb Hm2wf4Lfv4yxHMsOesPeqHXcbw+6Alhm5pcI/kqM+5xxb57xChNtME7SmKuxd5W4 jiCQbEH0k8zCeYjnk6pdFeM8c4NZ7cizQXcohluhIxxb8TcntKaNh+p3LUnzCcbX RLPg0PRtwsW8f0M4Lea9FC1GLKCSpDGXY+aniO9InPkLNHbFwpeon1KyIghqnKZ2 SvA1Nk32RaAK2veMDJjCM5fzRQYrQe00BS1FQePM7x8PR+3OaW/YGg3aZ8MX7UHv bKRcmRQ+KZ5gXijef9H+/bx3SckkS5z0BfTfxdx5bjbEbIDBHBPUEEuFwRQYL09R oP42weXzImh+QQUxTVxtNsjCNOkBjHvLpOevcGP0ZgT6itrnLLUzBuelDGGz4GdO zqt+XnG9Itl4TrgHnDmLs0X4PHCugP4C4D7gRcBLls4y4QvAKYPsIuBLgFcAXwZ8 BfCrCjenuUh4FTivgew1wFcBX7O+BtfF8maiia2/ChE7N0Df66BvHfCbgL9h2Xnz FXa0jrcsubcvKfeOJXcrXk7OvQs+vyf2T+fe+2GM8zo/P6D2NqztQ5D/SPVlzrvM fAzl3Mcg8wnIfDpB5g7IfAYyn0+Q+QJkvqScnKXxXdHXZ3+D5nQcaha3DtxNww3j c8/iN4D/VQz/PmE5Gm8Bf9vy5WuL+w1wd2J0P7D4u8Dfi/C55xG+D3F6qAqU7B8o rikshySvuU2w+0j0Xep/SwVI2/1O6pTFw/AfAxYUk0XCvwd7P1iF7Edqf5KFjPvi m+tPiwKmc/JnKGCPCfvF4rSAUyHsSNpUfixIvQpvg9wxyOla0InIjd8ounDW8Gze ovmenA/tPQF7JzH2nl5gr0x4Tt18ZH9W9T3f0vHsAh16/tfxee273Ua+M8+ttZ9O +M78Ru0Z5RNTXFm7HZbdrO1stpq1g/uNppj5k5lD7apGF3OVQLrIXAmLe6BM9qG4 u2ouLKhOBOMlRzmSx2Ly1LLpWjb14lNgMx21FdF3YOmbsvRtQPJPx/icifFZH8Ys HK4ZOIyz1iHKxfifhw+qB3rmrOKqOdHLQehDAQqF3mw/Zh3FsXVE46STsUQHZCmc j0tGmTguK9UbW9u791p7+7WHjxqtvfphs7a507grWH8w89PJM8fh9gVvAGNIJ0+Y RObm5TNYtANfTx30FHATwE0Dl26MXngl12Pu6WTOAD8LQZ+xqsSrboBJs7khT938 1PpX4zc2kDVfpAJ8kXyzuSG/aFWHEtiK3vyivEVImoR1y1girj4UFeWD7C9bcyv0 3ltR+xrso0yMFMtt77bqO0FqHO7vNYN8WAvTwRw4nRvcunnH7H/k4DlwYFw4eOPP sCDnzN7LKlwEP9MsVz8fjfpnd6rVzkvx6mHhM82lG44T5rGMU4omp5hnZE/61f5Z pxcvReyCYctnbVW/r118tEyWoIewluBjEmUjYZ5xVfOM02LJMbH1GDF4PFbXu70n 7fPT0U3QkrC1/A8+X4q3URAAAAAAEFE= `observer world` H4sIAAAAAAAAAGMQSMhPKk4tKkstUiguSSxJTXBggAMrBq6CnPyS8syU9NQSIJ+F gS0nNS+9JAPIFmBgB8kVpOaBlXKDNcNlOYCYiYGxHCwnCLShJDE5J7U4Pr8gsbA0 1R4oyAjDQEKOGcgAAI/CKMGKAAAAAAAAig== `patch world` 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 nQ== `turtle world` H4sIAAAAAAAAAL2Wz2sTQRTHX9L8apqmrfYgEjBI0BpiaTex3ZOOB/8MSdJkulkN u9vN2h+3eC0axIN4U7woBfEmHgQXPVQQxbOnSM6CdxF9s/Nm2z+g04Xd7/uGyXxm 3sy8XSi2gnt+0OflQdAOeItBfD2DTJ87VtDDeAjpDZ/zLoYVyHt9N9ixuxYP0Dcg K7zHHTTLkO64fdfHsASpvU4UFWAm6jzuzYQcNu+6O46HzoD0oNf2OIZVSO3K/6Rg aqfnRuPIDHrUsg7ZHm93bcdCs4j3Gcg73LZ6G67fXI0aH3kDXeKYr6NPQr5r41ic Do/aTx3zRkQ98qJ9GnJB28d5Rq0zsRNts7ETLXOQkQ7jaUjYYiiQEp1hNAOFdqeD 8/fbge06UUrS2/aguYvhrAz3MCzCdPRr03Y6aOek3SM7DzlhBwEXuVgQs/2HF6Xi bHhRLltoSGV90qXJyPwZvInXtRAlJiGe0eMEbrEUoUm8KqlVlloZmZOHf75p5i+w a8RdJ91ekVp/Nxk13j7RzJ9nDcp/hfgeaW3rsORceqGZP3fjt+KRBmOpBuZ//4Gh mV+M518nvh9KXTk4OHj59ZVm/mxI6x6WiH+3LHWptHV4/vVHzfwCWyYunUO22ZJa QX6JP9LMnwlXiTuv8v+d8o/7fw08zfw8yxF3jdSTA2G1U9l/02r/xXp7KLWK9W/8 9LNmfk7NP16HO2Wpl83JaP3+Lc387Ad1/lUdtp5LrYi3xOOCZn6Gqbqn1r81lrqE +L8/rmvmp9ki5V/VP38odQWPn5vc18xPhdR9XAc2GeUf19/8ckEzfypUXKWePPLs KvIbv3TXn2Scd1UHmjIj7Ir4/si818xPxO//c6Sn+/0DoZo37UN2cyjVKGL9+1TT yf8PBqj70cYLAAAAAAvG