├── docs ├── NO_GC.gif ├── COPY_GC.gif ├── MARK_SWEEP_GC.gif ├── REF_COUNT_GC.gif ├── MARK_COMPACT_GC.gif ├── step-by-step.html ├── engine.js └── frames.js ├── data ├── dkp.log-small └── dkp.log-big ├── .gitignore ├── Makefile ├── reference ├── dkp.rb ├── dkp.scala └── dkp-bad.rb ├── LICENSE ├── README.md └── dkp.cc /docs/NO_GC.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kenfox/gc-viz/HEAD/docs/NO_GC.gif -------------------------------------------------------------------------------- /docs/COPY_GC.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kenfox/gc-viz/HEAD/docs/COPY_GC.gif -------------------------------------------------------------------------------- /docs/MARK_SWEEP_GC.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kenfox/gc-viz/HEAD/docs/MARK_SWEEP_GC.gif -------------------------------------------------------------------------------- /docs/REF_COUNT_GC.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kenfox/gc-viz/HEAD/docs/REF_COUNT_GC.gif -------------------------------------------------------------------------------- /data/dkp.log-small: -------------------------------------------------------------------------------- 1 | 5,Jo,Trash 2 | -1,Jo,Candy 3 | 5,Al,Yard 4 | -3,Jo,Game 5 | -1,Al,Candy 6 | -------------------------------------------------------------------------------- /docs/MARK_COMPACT_GC.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kenfox/gc-viz/HEAD/docs/MARK_COMPACT_GC.gif -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files 2 | *.slo 3 | *.lo 4 | *.o 5 | *.obj 6 | 7 | # Compiled Dynamic libraries 8 | *.so 9 | *.dylib 10 | *.dll 11 | 12 | # Compiled Static libraries 13 | *.lai 14 | *.la 15 | *.a 16 | *.lib 17 | 18 | # Executables 19 | *.exe 20 | *.out 21 | *.app 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | #ALGO=NO_GC 3 | #ALGO=REF_COUNT_GC 4 | ALGO=MARK_SWEEP_GC 5 | #ALGO=MARK_COMPACT_GC 6 | #ALGO=COPY_GC 7 | 8 | $(ALGO).gif: dkp.exe 9 | ./dkp.exe data/dkp.log-big > frames.js 10 | rm -f $(ALGO).gif 11 | convert -loop 1 -delay 3 *.xpm $(ALGO).gif 12 | mv -f *.xpm raw 13 | 14 | dkp.exe: Makefile dkp.cc 15 | g++ -D$(ALGO)=1 -o dkp.exe dkp.cc 16 | -------------------------------------------------------------------------------- /reference/dkp.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | def dkp_log 4 | File.foreach("data/dkp.log-big").map { |line| 5 | amount, person, thing = line.strip.split(",") 6 | [ amount.to_i, person, thing ] 7 | } 8 | end 9 | 10 | standings = dkp_log.group_by { |trans| trans[1] }.map { |person, history| 11 | [ person, history.reduce(0) { |sum, trans| sum + trans[0] } ] 12 | }.sort { |a, b| b[1] <=> a[1] } 13 | 14 | puts standings.to_json 15 | -------------------------------------------------------------------------------- /reference/dkp.scala: -------------------------------------------------------------------------------- 1 | 2 | val standings = scala.io.Source.fromFile(new java.io.File("data/dkp.log-big")) 3 | .getLines() 4 | .map(line => { 5 | val Array(amount, person, thing) = line.split(',') 6 | (amount.toInt, person, thing) 7 | }) 8 | .toSeq 9 | .groupBy(trans => trans._2) 10 | .toSeq 11 | .map(person => { 12 | person._1 -> person._2.foldLeft(0)((sum, trans) => sum + trans._1) 13 | }) 14 | .sortWith((a, b) => b._2 < a._2) 15 | 16 | println(standings) 17 | -------------------------------------------------------------------------------- /data/dkp.log-big: -------------------------------------------------------------------------------- 1 | 10,Mal,Temple of the Jade Serpent 2 | 10,Wash,Temple of the Jade Serpent 3 | 10,Zoe,Temple of the Jade Serpent 4 | 10,Jayne,Temple of the Jade Serpent 5 | 10,Kaylee,Temple of the Jade Serpent 6 | -3,Mal,Pistol 7 | -3,Wash,Hawaiian Shirt 8 | -8,Jayne,Grenade Launcher 9 | -1,Kaylee,Wrench 10 | 10,Zoe,Shando-Pan Monastery 11 | 10,Wash,Shando-Pan Monastery 12 | 10,Mal,Shando-Pan Monastery 13 | 10,Jayne,Shando-Pan Monastery 14 | 10,Shepherd,Shando-Pan Monastery 15 | -2,Wash,Cargo Shorts 16 | -------------------------------------------------------------------------------- /reference/dkp-bad.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | # This program is almost identical to dkp.rb, but because 4 | # a large temporary result is assigned to a variable, it 5 | # becomes a live GC root and prevents it from becoming 6 | # garbage. 7 | 8 | # Functional style avoids temporary variables partly to 9 | # avoid this unnecessary capture. Garbage is generated like 10 | # crazy in functional style, but it usually performs fine 11 | # due to good GC algorithms that scale with live data. 12 | 13 | dkp_log = File.foreach("data/dkp.log-big").map { |line| 14 | amount, person, thing = line.strip.split(",") 15 | [ amount.to_i, person, thing ] 16 | } 17 | 18 | standings = dkp_log.group_by { |trans| trans[1] }.map { |person, history| 19 | [ person, history.reduce(0) { |sum, trans| sum + trans[0] } ] 20 | }.sort { |a, b| b[1] <=> a[1] } 21 | 22 | puts standings.to_json 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Ken Fox 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /docs/step-by-step.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | GC Animation 5 | 6 | 11 | 12 | 13 |

GC

14 | 15 |
16 | 17 |
18 | 19 | 20 | 21 | 22 |
23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | gc-viz 2 | ====== 3 | 4 | Animated visualizations of several garbage collection algorithms. 5 | 6 | ``` 7 | make 8 | open MARK_SWEEP_GC.gif 9 | ``` 10 | 11 | The GIF output requires ImageMagick installed. Edit the Makefile to 12 | choose a different algorithm. If you add more data to the sample, 13 | you'll probably have to increase the GC heap size. This is just a toy 14 | after all! 15 | 16 | The interesting thing here is the GC algorithm animations, but in 17 | order to excercise the GC, I had to create a small sample program. 18 | The `reference` directory contains Ruby and Scala implementations 19 | of the sample program. The `dkp.cc` that generates the visualizations 20 | implements similar logic with the exception that it has the world's 21 | worst sort. 22 | 23 | Here are some notes from one of my talks on GC. I highly recommend 24 | the book _Garbage Collection: Algorithms for Automatic Dynamic Memory 25 | Management_ by Jones and Lins. I haven't read Jones' newer book. 26 | You can also find excellent overviews by Googling "GC algorithm survey"; 27 | Paul Wilson's was very useful to me, but there should be newer surveys 28 | available. 29 | 30 | What Is Garbage Collection? 31 | =========================== 32 | 33 | - automatic 34 | - resource - usually memory, but practical for any storage 35 | - management 36 | 37 | - very old technology, general purpose ideas 38 | - misunderstanding causes problems, e.g. "map of weak refs" != cache 39 | 40 | - goals of GC: higher level code, uncouple systems, improve performance 41 | 42 | - different kinds of memory: unintuitive and getting worse: 43 | - L1 cache 1ns 44 | - L2 cache 10ns 45 | - main memory 100ns 46 | 47 | Most programmers are well into the phase of computing where we 48 | depend on the compiler and run-time for memory management just as 49 | we depend on the compiler for code generation. Highly constrained 50 | devices with small memories and/or hard real-time guarantees are 51 | still a problem for GC. 52 | 53 | Terminology 54 | 55 | - root set: active variables (and machine stuff: stack, cpu registers) 56 | - live set: reachable from root set 57 | - garbage: everything else 58 | 59 | Algorithms! 60 | =========== 61 | 62 | ## Free At Exit, aka There's Plenty of RAM 63 | 64 | `NO_GC` option in the Makefile. 65 | 66 | - simplest possible system 67 | - best concurrency (only allocator) 68 | - reasonable for small programs 69 | - definition of "small" increases as technology improves 70 | - no destructors 71 | 72 | ## Reference Counting 73 | 74 | `REF_COUNT_GC` option in the Makefile. 75 | 76 | - 1960 77 | - synchronous - destructors useful 78 | - accidentally ammortized (but long pauses possible) 79 | - simple concurrency 80 | - possible to retrofit 81 | 82 | - expensive in cpu 83 | - needs extra word per object to hold counts 84 | - no cycles 85 | - complicated api and/or leaky abstraction 86 | - expensive allocator (fragmentation, locality) 87 | - which allocator doesn't matter (time efficient slab allocator) 88 | - threading problems (mutating ref counts - no read-only data!, destructor runs on random thread) 89 | 90 | - iOS, file systems 91 | 92 | - extensions: 93 | - deferred ref count 94 | - deferred free 95 | - ref count tables 96 | - N bit (including 1 bit) ref counts 97 | 98 | ## Mark Sweep 99 | 100 | `MARK_SWEEP_GC` option in the Makefile. 101 | 102 | - 1960 103 | - traversal required 104 | - simple 105 | - destructors easy, but delayed 106 | - conservative option (traversal can be approximated) 107 | - possible to retrofit 108 | 109 | - asynch 110 | - expensive allocator (fragmentation, locality) 111 | - complicated concurrency (multi-color) 112 | 113 | - Lua, Flash, Ruby 114 | 115 | - extensions: 116 | - deferred free 117 | - mark tables (examine multiple objects at once) 118 | 119 | ## Mark Compact 120 | 121 | `MARK_COMPACT_GC` option in the Makefile. 122 | 123 | - 1964 124 | - precise traversal required 125 | - simple 126 | - minimum total memory usage 127 | - super cheap allocator ("bump" allocator with only a few instructions) 128 | - moving objects difficult to retrofit 129 | 130 | - needs 3 passes, but can trade memory for performance 131 | - very complicated concurrency (multi-color, barriers) 132 | 133 | - general algorithm that can make other problems easier 134 | - example: fair random row selection 135 | 136 | ``` 137 | first pass through the database compacts rows so that 138 | there are no gaps in position, e.g. 1, 2, 3, ... 139 | 140 | select * where position > random() order by position limit 1 141 | ``` 142 | 143 | ## Copy 144 | 145 | `COPY_GC` option in the Makefile. 146 | 147 | - 1962 148 | - precise traversal required 149 | - simplest 150 | - super cheap allocator 151 | - work proportional to live data (garbage doesn't matter!) 152 | 153 | - semi-spaces 154 | - no destructors - finalize should not be used 155 | - very complicated concurrency (multi-color, barriers) 156 | - moving objects difficult to retrofit 157 | 158 | - common degenerate case: per-transaction pool, delete when done 159 | 160 | - most useful gc algorithm whenever you have little live data 161 | - non-memory example: web session storage deletion on Amazon SimpleDB 162 | 163 | create new and old domains 164 | your server reads from new and faults old into it 165 | nightly: delete the old domain, create new one, and flip 166 | 167 | ## Generational, Ephemeral and more 168 | 169 | - 1984 170 | - hypothesis: most objects die young 171 | - chain together copy collectors 172 | - oldest generation can use a different gc method 173 | 174 | - inter-generational references suck 175 | - non-intuitive performance (garbage is cheap, reuse is expensive) 176 | 177 | - foundation for all advanced modern gc 178 | -------------------------------------------------------------------------------- /docs/engine.js: -------------------------------------------------------------------------------- 1 | var density = 'ultra'; 2 | 3 | var legend_canvas = document.getElementById('legend'); 4 | var legend_ctx = legend_canvas.getContext('2d'); 5 | legend_ctx.lineWidth = 1; 6 | legend_ctx.strokeStyle = "#ccccee"; 7 | if (legend_ctx.setLineDash) { 8 | legend_ctx.setLineDash([2,2]); 9 | } 10 | 11 | var memory_canvas = document.getElementById('memory'); 12 | var memory_ctx = memory_canvas.getContext('2d'); 13 | memory_ctx.textAlign = "end"; 14 | 15 | var animation_canvas = document.getElementById('animation'); 16 | var animation_ctx = animation_canvas.getContext('2d'); 17 | animation_ctx.lineJoin = 'round'; 18 | 19 | var drawing_canvas = document.getElementById('drawing'); 20 | var drawing_ctx = drawing_canvas.getContext('2d'); 21 | drawing_ctx.lineJoin = 'round'; 22 | 23 | var word_height; 24 | var word_width; 25 | var label_offset_x; 26 | var label_offset_y; 27 | 28 | if (density == 'low') { 29 | word_height = 30; 30 | word_width = 80; 31 | label_offset_x = word_width - 8; 32 | label_offset_y = word_height - 8; 33 | memory_ctx.font = "24px Helvetica,sans-serif;" 34 | animation_ctx.lineWidth = 3; 35 | } 36 | else if (density == 'high') { 37 | word_height = 16; 38 | word_width = 40; 39 | label_offset_x = word_width - 2; 40 | label_offset_y = word_height - 3; 41 | memory_ctx.font = "14px Helvetica,sans-serif;" 42 | animation_ctx.lineWidth = 2; 43 | } 44 | else if (density == 'ultra') { 45 | word_height = 12; 46 | word_width = 30; 47 | label_offset_x = word_width - 2; 48 | label_offset_y = word_height - 2; 49 | memory_ctx.font = "10px Helvetica,sans-serif" 50 | animation_ctx.lineWidth = 2; 51 | } 52 | else { // default medium density 53 | word_height = 20; 54 | word_width = 50; 55 | label_offset_x = word_width - 4; 56 | label_offset_y = word_height - 4; 57 | memory_ctx.font = "16px Helvetica,sans-serif;" 58 | animation_ctx.lineWidth = 3; 59 | } 60 | 61 | 62 | var word_half_height = Math.floor(word_height / 2); 63 | var word_half_width = Math.floor(word_width / 2); 64 | var memory_width = Math.floor(memory_canvas.width / word_width) 65 | 66 | function addressToPoint(addr) { 67 | var y = Math.floor(addr / memory_width); 68 | var x = addr - y * memory_width; 69 | return [x, y]; 70 | } 71 | 72 | function drawGuides() { 73 | var end_x = legend_canvas.width; 74 | var end_y = legend_canvas.height; 75 | for (var x = 0.5; x <= end_x; x += word_width) { 76 | legend_ctx.beginPath(); 77 | legend_ctx.moveTo(x, 0.5); 78 | legend_ctx.lineTo(x, end_y); 79 | legend_ctx.closePath(); 80 | legend_ctx.stroke(); 81 | } 82 | for (var y = 0.5; y <= end_y; y += word_height) { 83 | legend_ctx.beginPath(); 84 | legend_ctx.moveTo(0.5, y); 85 | legend_ctx.lineTo(end_x, y); 86 | legend_ctx.closePath(); 87 | legend_ctx.stroke(); 88 | } 89 | } 90 | 91 | var mem_content = [ 92 | ":nil" 93 | ]; 94 | 95 | function drawWord(addr) { 96 | var p = addressToPoint(addr); 97 | var x = p[0] * word_width + 1; 98 | var y = p[1] * word_height + 1; 99 | 100 | memory_ctx.fillStyle = "#222222"; 101 | memory_ctx.fillRect(x, y, word_width - 1, word_height - 1); 102 | 103 | var cell = mem_content[addr].toString(); 104 | if (cell) { 105 | if (cell.charAt(0) == "'") { 106 | memory_ctx.fillStyle = "#00ff00"; 107 | cell = cell.substring(1); 108 | } 109 | else if (cell.charAt(0) == "=") { 110 | memory_ctx.fillStyle = "#00ff00"; 111 | cell = cell.substring(1); 112 | } 113 | else if (cell.charAt(0) == ":") { 114 | memory_ctx.fillStyle = "#ffffff"; 115 | cell = cell.substring(1); 116 | } 117 | else { 118 | memory_ctx.fillStyle = "#ffff00"; 119 | var c = addressToPoint(mem_content[addr]); 120 | cell = c[1].toString() + "." + c[0]; 121 | } 122 | 123 | memory_ctx.fillText(cell, x + label_offset_x, y + label_offset_y); 124 | } 125 | } 126 | 127 | function clearWord(addr) { 128 | var p = addressToPoint(addr); 129 | var x = p[0] * word_width + 1; 130 | var y = p[1] * word_height + 1; 131 | 132 | memory_ctx.fillStyle = "#ffffff"; 133 | memory_ctx.fillRect(x, y, word_width - 1, word_height - 1); 134 | } 135 | 136 | function copyWords(to_addr, from_addr, count, subframe) { 137 | if (subframe >= 100) { 138 | for (var i = 0; i < count; ++i) { 139 | drawWord(to_addr + i); 140 | } 141 | } 142 | else { 143 | animation_ctx.fillStyle = "#000000"; 144 | animation_ctx.strokeStyle = "#00ff00"; 145 | 146 | var percent = subframe / 100; 147 | for (var i = 0; i < count; ++i) { 148 | var from_p = addressToPoint(from_addr + i); 149 | var from_x = from_p[0] * word_width; 150 | var from_y = from_p[1] * word_height; 151 | var from_mid_x = from_x + word_half_width; 152 | var from_mid_y = from_y + word_half_height; 153 | 154 | var to_p = addressToPoint(to_addr + i); 155 | var to_x = to_p[0] * word_width; 156 | var to_y = to_p[1] * word_height; 157 | 158 | var delta_x = Math.round((to_x - from_x) * percent); 159 | var delta_y = Math.round((to_y - from_y) * percent); 160 | 161 | animation_ctx.fillRect(from_x + delta_x, from_y + delta_y, 162 | word_width - 1, word_height - 1); 163 | 164 | if (i == 0) { 165 | animation_ctx.beginPath(); 166 | animation_ctx.moveTo(from_mid_x, from_mid_y); 167 | animation_ctx.lineTo(from_mid_x + delta_x, from_mid_y + delta_y); 168 | animation_ctx.stroke(); 169 | } 170 | } 171 | } 172 | } 173 | 174 | function blinkWords(list, subframe, color) { 175 | if (subframe < 100 && subframe % 20 != 0) { 176 | animation_ctx.strokeStyle = color; 177 | 178 | for (var i = 1; i < list.length; ++i) { 179 | var p = addressToPoint(list[i]); 180 | var x = p[0] * word_width; 181 | var y = p[1] * word_height; 182 | 183 | animation_ctx.strokeRect(x, y, word_width + 1, word_height + 1); 184 | } 185 | } 186 | } 187 | 188 | drawGuides(); 189 | drawWord(0); 190 | 191 | function draw_connection(event) { 192 | var totalOffsetX = 0; 193 | var totalOffsetY = 0; 194 | var currentElement = this; 195 | 196 | do { 197 | totalOffsetX += currentElement.offsetLeft; 198 | totalOffsetY += currentElement.offsetTop; 199 | } 200 | while (currentElement = currentElement.offsetParent); 201 | 202 | //var x = Math.floor((event.pageX - totalOffsetX) / word_width); 203 | //var y = Math.floor((event.pageY - totalOffsetY) / word_height); 204 | var x = Math.floor(event.layerX / word_width); 205 | var y = Math.floor(event.layerY / word_height); 206 | var addr = y * memory_width + x; 207 | 208 | x = x * word_width; 209 | y = y * word_height; 210 | 211 | drawing_ctx.clearRect(0, 0, drawing_canvas.width, drawing_canvas.height); 212 | 213 | if (mem_content[addr]) { 214 | drawing_ctx.lineWidth = 3; 215 | drawing_ctx.strokeStyle = "#ffffff"; 216 | drawing_ctx.strokeRect(x, y, word_width + 1, word_height + 1); 217 | 218 | var cell = mem_content[addr].toString(); 219 | var to_x; 220 | var to_y; 221 | 222 | if (cell.charAt(0) >= '0' && cell.charAt(0) <= '9') { 223 | var p = addressToPoint(mem_content[addr]); 224 | to_x = p[0] * word_width; 225 | to_y = p[1] * word_height; 226 | } 227 | 228 | if (to_x || to_y) { 229 | drawing_ctx.lineWidth = 1; 230 | drawing_ctx.beginPath(); 231 | drawing_ctx.moveTo(x + word_half_width, y + word_half_height); 232 | drawing_ctx.lineTo(to_x + word_half_width, to_y + word_half_height); 233 | drawing_ctx.stroke(); 234 | } 235 | } 236 | } 237 | 238 | drawing_canvas.addEventListener("mousedown", draw_connection, false); 239 | 240 | var requestAnimationFrame = (function() { 241 | return window.requestAnimationFrame || 242 | window.webkitRequestAnimationFrame || 243 | window.mozRequestAnimationFrame || 244 | window.oRequestAnimationFrame || 245 | window.msRequestAnimationFrame || 246 | function(callback) { 247 | window.setTimeout(callback, 1000 / 60); 248 | }; 249 | })(); 250 | 251 | var animation_running = false; 252 | var frame = 0; 253 | var subframe = 0; 254 | var frame_count = frame_content.length; 255 | 256 | function toggle_animation() { 257 | var button = document.getElementById('run_button'); 258 | animation_running = !animation_running; 259 | if (animation_running) { 260 | button.innerHTML = "Pause"; 261 | requestAnimationFrame(animate); 262 | } 263 | else { 264 | button.innerHTML = "Continue"; 265 | } 266 | var status = document.getElementById('run_status'); 267 | status.innerHTML = ""; 268 | } 269 | 270 | function pause_animation(message) { 271 | var button = document.getElementById('run_button'); 272 | animation_running = false; 273 | button.innerHTML = "Continue"; 274 | var status = document.getElementById('run_status'); 275 | status.innerHTML = message; 276 | } 277 | 278 | function stop_animation() { 279 | var button = document.getElementById('run_button'); 280 | frame = 0; 281 | animation_running = false; 282 | button.innerHTML = "Start"; 283 | var status = document.getElementById('run_status'); 284 | status.innerHTML = ""; 285 | var bp_msg = document.getElementById('bp_msg'); 286 | bp_msg.innerHTML = ""; 287 | } 288 | 289 | function animate(timestamp) { 290 | if (animation_running && frame < frame_count) { 291 | requestAnimationFrame(animate); 292 | animation_ctx.clearRect(0, 0, animation_canvas.width, animation_canvas.height); 293 | 294 | if (subframe == 0) { 295 | if (frame_content[frame][0] == 'box') { 296 | mem_content[frame_content[frame][1]] = frame_content[frame][2]; 297 | drawWord(frame_content[frame][1]); 298 | } 299 | else if (frame_content[frame][0] == 'set') { 300 | mem_content[frame_content[frame][1]] = frame_content[frame][2]; 301 | drawWord(frame_content[frame][1]); 302 | } 303 | else if (frame_content[frame][0] == 'alloc') { 304 | for (var i = 0; i < frame_content[frame][2]; ++i) { 305 | mem_content[frame_content[frame][1] + i] = ""; 306 | drawWord(frame_content[frame][1] + i); 307 | } 308 | } 309 | else if (frame_content[frame][0] == 'free') { 310 | for (var i = 0; i < frame_content[frame][2]; ++i) { 311 | mem_content[frame_content[frame][1] + i] = ""; 312 | clearWord(frame_content[frame][1] + i); 313 | } 314 | } 315 | else if (frame_content[frame][0] == 'ref_count') { 316 | } 317 | else if (frame_content[frame][0] == 'bp') { 318 | var bp_msg = document.getElementById('bp_msg'); 319 | bp_msg.innerHTML = frame_content[frame][1]; 320 | } 321 | else if (frame_content[frame][0] == 'roots') { 322 | blinkWords(frame_content[frame], 1, "#ff0000"); 323 | pause_animation("root set"); 324 | } 325 | else if (frame_content[frame][0] == 'live') { 326 | blinkWords(frame_content[frame], 1, "#ff0000"); 327 | pause_animation("live set"); 328 | } 329 | else if (frame_content[frame][0] == 'stop') { 330 | stop_animation(); 331 | } 332 | else { 333 | // begin a subframe animation 334 | subframe += 10; 335 | if (frame_content[frame][0] == 'copy') { 336 | for (var i = 0; i < frame_content[frame][3]; ++i) { 337 | mem_content[frame_content[frame][1] + i] = mem_content[frame_content[frame][2] + i]; 338 | } 339 | copyWords(frame_content[frame][1], frame_content[frame][2], frame_content[frame][3], subframe); 340 | } 341 | } 342 | if (subframe == 0) { 343 | ++frame; 344 | } 345 | } 346 | else { 347 | subframe += 10; 348 | if (frame_content[frame][0] == 'copy') { 349 | copyWords(frame_content[frame][1], frame_content[frame][2], frame_content[frame][3], subframe); 350 | } 351 | else if (frame_content[frame][0] == 'roots') { 352 | blinkWords(frame_content[frame], subframe, "#ff0000"); 353 | } 354 | else if (frame_content[frame][0] == 'live') { 355 | blinkWords(frame_content[frame], subframe, "#ff0000"); 356 | } 357 | if (subframe >= 100) { 358 | subframe = 0; 359 | ++frame; 360 | } 361 | } 362 | } 363 | } 364 | -------------------------------------------------------------------------------- /dkp.cc: -------------------------------------------------------------------------------- 1 | /* 2 | * This file and the rest of this project are under the MIT License. 3 | * 4 | * This program contains toy implementations of several different 5 | * garbage collector algorithms instrumented to produce nice 6 | * visualizations of how the algorithms work. Many corners were cut to 7 | * simplify the code so they are neither general purpose nor 8 | * efficient. It's not all smoke and mirrors, but where smoke and 9 | * mirrors worked, that's what I used. 10 | * 11 | * If you are trying to understand GC algorithms, it's best to read a 12 | * good introductory text such as the Jones Lins book and only look at 13 | * the visualizations this program generates until you understand the 14 | * algorithm. 15 | * 16 | * Ken Fox 17 | * August 2014 18 | */ 19 | 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | const int HeapSize = 2000; 29 | const int HeapSemiSize = 1000; 30 | 31 | const int ImageWordSize = 5; 32 | const int ImageWidthInWords = 25; 33 | const int ImageHeight = (HeapSize / ImageWidthInWords) * ImageWordSize; 34 | const int ImageWidth = ImageWidthInWords * ImageWordSize; 35 | 36 | typedef signed short SWd; 37 | typedef unsigned short UWd; 38 | typedef unsigned short Loc; 39 | typedef void (*VisitFn)(Loc loc); 40 | 41 | void log_alloc_mem(Loc loc, int size); 42 | void log_free_mem(Loc loc, int size); 43 | void log_init_obj(void *addr, const char *type); 44 | void log_ref_count(Loc loc, int ref_count); 45 | void log_ref_count(void *addr, int ref_count); 46 | void log_get_val(const void *addr); 47 | void log_set_val(void *addr, char val); 48 | void log_set_val(void *addr, int val); 49 | void log_set_ref(void *addr, Loc val); 50 | void log_copy_mem(Loc to, Loc from, int size); 51 | void log_copy_mem(void *to, void *from, int size); 52 | 53 | // The Obj classes hold data values stored in Mem.heap. 54 | // A custom type tagging system is used instead of C++ virtual 55 | // because the heap is explicitly managed to demonstrate GC. 56 | // All fields in Obj (or sub-type) must be sizeof(SWd). Hopefully 57 | // the compiler will then layout objects so they map directly 58 | // to an array of Swd. (struct equivalence runs deep...) 59 | 60 | // WARNING! None of the value classes can allocate memory! 61 | // If a collection occurs inside a value method, the object 62 | // may move and cause memory corruption. Allocation must 63 | // happen in the Ref classes and those classes must handle 64 | // being moved. 65 | 66 | class Obj { 67 | private: 68 | Obj(const Obj &rhs); 69 | Obj &operator=(const Obj &rhs); 70 | 71 | public: 72 | static const char *TypeName[]; 73 | enum Type { TNil=0, TForward=1, TFree=2, TNum=3, TTup=4, TVec=5, TStr=6 }; 74 | struct { 75 | UWd ref_count : 8; 76 | UWd mark : 1; 77 | UWd type : 4; 78 | } header; 79 | 80 | void init(Type type) { 81 | log_init_obj(&header, TypeName[type]); 82 | header.type = type; 83 | init_ref_count(); 84 | header.mark = 0; 85 | } 86 | 87 | static Obj *at(Loc loc); 88 | 89 | Type type() const { return (Type)header.type; } 90 | 91 | void init_ref_count() { 92 | #if REF_COUNT_GC 93 | header.ref_count = 1; 94 | log_ref_count(&header, header.ref_count); 95 | #else 96 | header.ref_count = 0; 97 | #endif 98 | } 99 | 100 | void inc_ref_count() { 101 | #if REF_COUNT_GC 102 | header.ref_count += 1; 103 | log_ref_count(&header, header.ref_count); 104 | #endif 105 | } 106 | 107 | bool dec_ref_count() { 108 | #if REF_COUNT_GC 109 | header.ref_count -= 1; 110 | log_ref_count(&header, header.ref_count); 111 | if (header.ref_count == 0) { 112 | cleanup(); 113 | return true; 114 | } 115 | else { 116 | return false; 117 | } 118 | #else 119 | return false; 120 | #endif 121 | } 122 | 123 | void traverse(VisitFn f) const; 124 | void fixup_references(); 125 | void cleanup(); 126 | UWd size() const; 127 | SWd to_i() const; 128 | bool equals(const Obj *that) const; 129 | void dump() const; 130 | }; 131 | 132 | // The Ref classes represent pointers to data values stored in mem. 133 | // A raw pointer must never be exposed in a place where a GC may 134 | // happen because the C++ registers, stack and temporaries are not 135 | // treated as roots. 136 | 137 | // Refs never move because they are not allocated in Mem::heap, 138 | // however, the loc value (which is a numeric offset from the start of 139 | // the heap) in a Ref may change at any time. 140 | 141 | class ObjRef { 142 | private: 143 | friend class Mem; 144 | 145 | ObjRef &operator=(const ObjRef &rhs); 146 | 147 | static ObjRef *root; 148 | ObjRef *prev; 149 | ObjRef *next; 150 | 151 | void add_to_root_set() { 152 | prev = 0; 153 | if (root) { 154 | root->prev = this; 155 | next = root; 156 | } 157 | else { 158 | next = 0; 159 | } 160 | root = this; 161 | } 162 | 163 | protected: 164 | enum RefType { ALLOC, COPY, SHARE }; 165 | volatile Loc loc; 166 | 167 | ObjRef(RefType type, UWd loc_or_size, UWd new_size = 0); 168 | 169 | public: 170 | static ObjRef *nil; 171 | 172 | ObjRef(const ObjRef &that); 173 | 174 | ~ObjRef(); 175 | 176 | Loc share(); 177 | static ObjRef at(Loc loc) { return ObjRef(ObjRef::SHARE, loc); } 178 | static void unshare(Loc loc); 179 | 180 | Obj *referenced_Obj() const { return Obj::at(loc); } 181 | 182 | Obj::Type type() const { return referenced_Obj()->type(); } 183 | UWd size() const { return referenced_Obj()->size(); } 184 | SWd to_i() const { return referenced_Obj()->to_i(); } 185 | void dump() const { referenced_Obj()->dump(); } 186 | bool equals(ObjRef that) const { 187 | return referenced_Obj()->equals(that.referenced_Obj()); 188 | } 189 | }; 190 | 191 | // Pluggable memory management and GC algorithms. 192 | 193 | class FreeBlock: public Obj { 194 | public: 195 | UWd len; 196 | UWd size() const { return len; } 197 | }; 198 | 199 | class ForwardingAddress: public Obj { 200 | public: 201 | UWd to; 202 | }; 203 | 204 | struct MemInfo { 205 | static uint time; 206 | 207 | bool is_allocated; 208 | bool is_overhead; 209 | uint last_write; 210 | uint last_read; 211 | 212 | MemInfo() { 213 | is_allocated = false; 214 | is_overhead = false; 215 | last_read = 0; 216 | last_write = 0; 217 | } 218 | 219 | void was_allocated() { 220 | is_allocated = true; 221 | is_overhead = false; 222 | last_read = 0; 223 | last_write = 0; 224 | } 225 | 226 | void was_freed() { is_allocated = false; } 227 | void was_read() { last_read = ++time; } 228 | void was_written() { last_write = ++time; is_overhead = false; } 229 | void was_overhead() { last_write = ++time; is_overhead = true; } 230 | }; 231 | 232 | class Mem { 233 | public: 234 | // Real GC algorithms use unused heap space for marking the live 235 | // sets and storing forwarding addresses for moved objects. 236 | static std::map forwarding; 237 | static std::set live; 238 | static UWd heap[HeapSize]; 239 | static MemInfo info[HeapSize]; // visualization info 240 | static Loc top; 241 | static Loc from_space; 242 | static Loc to_space; 243 | 244 | static Loc addr_to_loc(const void *addr) { 245 | Loc loc = ((char *)(addr) - (char *)heap) / sizeof(UWd); 246 | assert(loc < HeapSize); 247 | return loc; 248 | } 249 | 250 | // TODO: implement a first-fit algorithm instead of just the bump allocator. 251 | // free must add memory back to allocator, blocks should be coalesced 252 | 253 | static Loc reserve(UWd size) { 254 | Loc loc = top; 255 | top += size; 256 | assert(top < HeapSize); 257 | log_alloc_mem(loc, size); 258 | return loc; 259 | } 260 | 261 | static Loc reserve_with_possible_overlap(UWd size) { 262 | Loc loc = top; 263 | top += size; 264 | assert(top < HeapSize); 265 | return loc; 266 | } 267 | 268 | static Loc alloc(UWd size) { 269 | Loc loc = reserve(size); 270 | for (int i = 0; i < size; ++i) { 271 | heap[loc + i] = 0; 272 | } 273 | return loc; 274 | } 275 | 276 | static Loc copy(Loc from, UWd new_size = 0) { 277 | UWd size = Obj::at(from)->size(); 278 | if (new_size > 0) { 279 | Loc to = reserve(new_size); 280 | UWd min = (new_size < size) ? new_size : size; 281 | for (int i = 0; i < min; ++i) { 282 | heap[to + i] = heap[from + i]; 283 | } 284 | for (int i = min; i < new_size; ++i) { 285 | heap[to + i] = 0; 286 | } 287 | log_copy_mem(to, from, min); 288 | return to; 289 | } 290 | else { 291 | Loc to = reserve(size); 292 | for (int i = 0; i < size; ++i) { 293 | heap[to + i] = heap[from + i]; 294 | } 295 | log_copy_mem(to, from, size); 296 | return to; 297 | } 298 | } 299 | 300 | static Loc move_without_forwarding(Loc from, UWd size) { 301 | Obj *from_obj = Obj::at(from); 302 | Loc to = reserve_with_possible_overlap(size); 303 | for (int i = 0; i < size; ++i) { 304 | heap[to + i] = heap[from + i]; 305 | } 306 | log_copy_mem(to, from, size); 307 | return to; 308 | } 309 | 310 | static Loc move(Loc from) { 311 | Obj *from_obj = Obj::at(from); 312 | UWd size = from_obj->size(); 313 | Loc to = reserve(size); 314 | for (int i = 0; i < size; ++i) { 315 | heap[to + i] = heap[from + i]; 316 | } 317 | ForwardingAddress *b = (ForwardingAddress *)from_obj; 318 | b->init(Obj::TForward); 319 | b->to = to; 320 | log_copy_mem(to, from, size); 321 | return to; 322 | } 323 | 324 | static Loc read_barrier(Loc loc) { 325 | return loc; 326 | } 327 | 328 | static void free(Loc loc, int size) { 329 | FreeBlock *b = (FreeBlock *)Obj::at(loc); 330 | b->init(Obj::TFree); 331 | b->len = size; 332 | log_free_mem(loc, size); 333 | } 334 | 335 | static void mark_live_loc(Loc loc) { 336 | if (loc != 0) { 337 | #if !COPY_GC 338 | log_ref_count(loc, 1); // treat marking as ref count for visualization 339 | #endif 340 | live.insert(loc); 341 | } 342 | } 343 | 344 | static void mark_live() { 345 | ObjRef *p = ObjRef::root; 346 | live.clear(); 347 | while (p) { 348 | Loc loc = p->loc; 349 | mark_live_loc(loc); 350 | Obj::at(loc)->traverse(mark_live_loc); 351 | p = p->next; 352 | } 353 | } 354 | 355 | static void sweep_garbage() { 356 | Loc loc = 1; 357 | while (loc < top) { 358 | Obj *obj = Obj::at(loc); 359 | int size = obj->size(); 360 | if (live.count(loc) == 0) { 361 | free(loc, size); 362 | } 363 | loc += size; 364 | } 365 | } 366 | 367 | static void move_live() { 368 | mark_live(); 369 | // nil is located at heap loc 0 and doesn't move 370 | top = (top >= HeapSemiSize) ? 1 : HeapSemiSize; 371 | std::set::iterator it; 372 | for (it = live.begin(); it != live.end(); ++it) { 373 | Loc from = *it; 374 | if (from) { 375 | move(from); 376 | } 377 | } 378 | } 379 | 380 | static void compact_live() { 381 | forwarding.clear(); 382 | mark_live(); 383 | Loc old_top = top; 384 | Loc from = 1; 385 | while (from < old_top) { 386 | Obj *obj = Obj::at(from); 387 | int size = obj->size(); 388 | if (live.count(from) > 0) { 389 | if (old_top != top) { 390 | Loc to = move_without_forwarding(from, size); 391 | forwarding[from] = to; 392 | } 393 | } 394 | else if (old_top == top) { 395 | top = from; 396 | } 397 | from += size; 398 | } 399 | } 400 | 401 | static Loc loc_after_move(Loc loc) { 402 | #if COPY_GC 403 | ForwardingAddress *b = (ForwardingAddress *)Obj::at(loc); 404 | return (b->type() == Obj::TForward) ? b->to : loc; 405 | #else 406 | std::map::iterator it = forwarding.find(loc); 407 | return (it != forwarding.end()) ? it->second : loc; 408 | #endif 409 | } 410 | 411 | static void fixup_references() { 412 | ObjRef *p = ObjRef::root; 413 | while (p) { 414 | p->loc = loc_after_move(p->loc); 415 | p = p->next; 416 | } 417 | #if COPY_GC 418 | Loc loc = (top >= HeapSemiSize) ? HeapSemiSize : 1; 419 | #else 420 | Loc loc = 1; 421 | #endif 422 | while (loc < top) { 423 | Obj *obj = Obj::at(loc); 424 | int size = obj->size(); 425 | obj->fixup_references(); 426 | loc += size; 427 | } 428 | } 429 | 430 | static void gc() { 431 | #if MARK_SWEEP_GC 432 | mark_live(); 433 | sweep_garbage(); 434 | #else 435 | #if COPY_GC 436 | move_live(); 437 | fixup_references(); 438 | if (top >= HeapSemiSize) { 439 | log_free_mem(1, HeapSemiSize - 1); 440 | } 441 | else { 442 | log_free_mem(HeapSemiSize, HeapSemiSize); 443 | } 444 | #else 445 | #if MARK_COMPACT_GC 446 | Loc old_top = top; 447 | compact_live(); 448 | if (old_top > top) { 449 | fixup_references(); 450 | log_free_mem(top, old_top - top); 451 | } 452 | #endif 453 | #endif 454 | #endif 455 | } 456 | 457 | static void add_live_loc(Loc loc) { 458 | live.insert(loc); 459 | } 460 | 461 | static void log_roots(std::string msg) { 462 | ObjRef *p = ObjRef::root; 463 | std::cout << "['bp','" << msg << "'],\n"; 464 | std::cout << "['roots'"; 465 | live.clear(); 466 | while (p) { 467 | Loc loc = p->loc; 468 | std::cout << "," << loc; 469 | live.insert(loc); 470 | Obj::at(loc)->traverse(add_live_loc); 471 | p = p->next; 472 | } 473 | std::cout << "],\n"; 474 | std::cout << "['live'"; 475 | std::set::iterator it; 476 | for (it = live.begin(); it != live.end(); ++it) { 477 | std::cout << "," << *it; 478 | } 479 | std::cout << "],\n"; 480 | } 481 | 482 | static char color_of_mem_loc(Loc loc) { 483 | MemInfo &info = Mem::info[loc]; 484 | if (info.is_allocated) { 485 | const char *color; 486 | int age; 487 | if (info.last_read > info.last_write) { 488 | color = "0123456789"; 489 | age = info.time - info.last_read; 490 | } 491 | else { 492 | color = "abcdefghij"; 493 | age = info.time - info.last_write; 494 | } 495 | if (age == info.time) { return '+'; } 496 | if (age < 5) { 497 | return info.is_overhead ? '#' : color[0]; 498 | } 499 | if (age < 25) { return color[1]; } 500 | if (age < 125) { return color[2]; } 501 | return color[3]; 502 | } 503 | else { 504 | return ' '; 505 | } 506 | } 507 | 508 | // Try to stay under the 2MB spin limit for the resulting animation. 509 | 510 | static void snap() { 511 | static int frame = 0; 512 | char xpm_file_name[20]; 513 | sprintf(xpm_file_name, "img%08d.xpm", frame++); 514 | 515 | std::ofstream xpm_file; 516 | xpm_file.open(xpm_file_name); 517 | 518 | xpm_file << "/* XPM */\n" 519 | << "static char * plaid[] =\n" 520 | << "{\n" 521 | << "/* width height ncolors chars_per_pixel */\n" 522 | << "\"" << ImageWidth << " " << ImageHeight << " 11 1\",\n" 523 | << "/* colors */\n" 524 | << "\" c black\",\n" 525 | << "\"+ c #888888\",\n" 526 | << "\"# c #ff0000\",\n" 527 | << "\"0 c #00ff00\",\n" // 22ee22 528 | << "\"1 c #22cc22\",\n" 529 | << "\"2 c #22aa22\",\n" 530 | << "\"3 c #228822\",\n" 531 | << "\"a c #ffff00\",\n" // eeee22 532 | << "\"b c #cccc22\",\n" 533 | << "\"c c #aaaa22\",\n" 534 | << "\"d c #888822\",\n" 535 | << "/* pixels */\n"; 536 | 537 | char row[ImageWordSize][ImageWidth + 1]; 538 | for (int py = 0; py < ImageWordSize; ++py) { 539 | row[py][ImageWidth] = 0; 540 | } 541 | 542 | int loc_x = 0; 543 | for (Loc loc = 0; loc < HeapSize; ++loc) { 544 | char c = color_of_mem_loc(loc); 545 | 546 | for (int py = 0; py < ImageWordSize; ++py) { 547 | for (int px = 0; px < ImageWordSize; ++px) { 548 | row[py][loc_x + px] = c; 549 | } 550 | } 551 | #if 0 552 | if (loc % (frame + 6) == 0) { 553 | row[1][loc_x + 1] = '#'; 554 | } 555 | #endif 556 | loc_x += ImageWordSize; 557 | 558 | if (loc_x == ImageWidth) { 559 | for (int py = 0; py < ImageWordSize; ++py) { 560 | xpm_file << "\"" << row[py] << "\",\n"; 561 | } 562 | loc_x = 0; 563 | } 564 | } 565 | 566 | xpm_file << "};\n"; 567 | xpm_file.close(); 568 | } 569 | }; 570 | 571 | uint MemInfo::time = 0; 572 | UWd Mem::heap[HeapSize]; 573 | MemInfo Mem::info[HeapSize]; 574 | Loc Mem::top = 0; 575 | std::map Mem::forwarding; 576 | std::set Mem::live; 577 | 578 | ObjRef *ObjRef::root = 0; 579 | ObjRef *ObjRef::nil = new ObjRef(ObjRef::SHARE, 0); 580 | 581 | static bool log_ready = false; 582 | void log_start() { log_ready = true; } 583 | void log_stop() { log_ready = false; } 584 | #define log_msg(M) if (log_ready) { std::cout << M; Mem::snap(); } 585 | 586 | void log_alloc_mem(Loc loc, int size) { 587 | for (int i = 0; i < size; ++i) { 588 | Mem::info[loc + i].was_allocated(); 589 | } 590 | log_msg("['alloc'," << loc << ',' << size << "],\n"); 591 | } 592 | 593 | void log_free_mem(Loc loc, int size) { 594 | for (int i = 0; i < size; ++i) { 595 | Mem::info[loc + i].was_freed(); 596 | } 597 | log_msg("['free'," << loc << ',' << size << "],\n"); 598 | } 599 | 600 | void log_init_obj(void *addr, const char *type) { 601 | if (log_ready) { 602 | std::cout << "['init'," << Mem::addr_to_loc(addr) << ",'" << type << "'],\n"; 603 | } 604 | } 605 | 606 | void log_ref_count(Loc loc, int ref_count) { 607 | Mem::info[loc].was_overhead(); 608 | log_msg("['ref_count'," << loc << "," << ref_count << "],\n"); 609 | } 610 | 611 | void log_ref_count(void *addr, int ref_count) { 612 | log_ref_count(Mem::addr_to_loc(addr), ref_count); 613 | } 614 | 615 | void log_get_val(const void *addr) { 616 | Loc loc = Mem::addr_to_loc(addr); 617 | Mem::info[loc].was_read(); 618 | if (log_ready) { 619 | Mem::snap(); 620 | } 621 | } 622 | 623 | void log_set_val(void *addr, char val) { 624 | Loc loc = Mem::addr_to_loc(addr); 625 | Mem::info[loc].was_written(); 626 | log_msg("['set'," << loc << ",\"'" << val << "\"],\n"); 627 | } 628 | 629 | void log_set_val(void *addr, int val) { 630 | Loc loc = Mem::addr_to_loc(addr); 631 | Mem::info[loc].was_written(); 632 | log_msg("['set'," << loc << ",'=" << val << "'],\n"); 633 | } 634 | 635 | void log_set_ref(void *addr, Loc val) { 636 | Loc loc = Mem::addr_to_loc(addr); 637 | Mem::info[loc].was_written(); 638 | log_msg("['set'," << loc << "," << val << "],\n"); 639 | } 640 | 641 | void log_copy_mem(Loc to, Loc from, int size) { 642 | for (int i = 0; i < size; ++i) { 643 | Mem::info[from + i].was_read(); 644 | Mem::info[to + i].was_written(); 645 | } 646 | log_msg("['copy'," << to << ',' << from << ',' << size << "],\n"); 647 | } 648 | 649 | void log_copy_mem(void *to, void *from, int size) { 650 | log_copy_mem(Mem::addr_to_loc(to), Mem::addr_to_loc(from), size); 651 | } 652 | 653 | ObjRef::ObjRef(RefType type, UWd loc_or_size, UWd new_size) { 654 | switch (type) { 655 | case ALLOC: 656 | loc = Mem::alloc(loc_or_size); 657 | referenced_Obj()->init_ref_count(); 658 | break; 659 | case COPY: 660 | loc = Mem::copy(loc_or_size, new_size); 661 | referenced_Obj()->init_ref_count(); 662 | break; 663 | case SHARE: 664 | loc = Mem::read_barrier(loc_or_size); 665 | referenced_Obj()->inc_ref_count(); 666 | break; 667 | } 668 | add_to_root_set(); 669 | } 670 | 671 | ObjRef::ObjRef(const ObjRef &that) { 672 | loc = Mem::read_barrier(that.loc); 673 | referenced_Obj()->inc_ref_count(); 674 | add_to_root_set(); 675 | } 676 | 677 | ObjRef::~ObjRef() { 678 | if (next) { next->prev = prev; } 679 | if (prev) { prev->next = next; } 680 | if (root == this) { 681 | root = next; 682 | } 683 | if (referenced_Obj()->dec_ref_count()) { 684 | Mem::free(loc, referenced_Obj()->size()); 685 | } 686 | prev = 0; 687 | next = 0; 688 | loc = 0; 689 | } 690 | 691 | Loc ObjRef::share() { 692 | loc = Mem::read_barrier(loc); 693 | referenced_Obj()->inc_ref_count(); 694 | return loc; 695 | } 696 | 697 | void ObjRef::unshare(Loc loc) { 698 | if (loc) { 699 | Obj *obj = Obj::at(loc); 700 | if (obj->dec_ref_count()) { 701 | Mem::free(loc, obj->size()); 702 | } 703 | } 704 | } 705 | 706 | // Value classes (not part of the GC system) 707 | 708 | class Num: public Obj { 709 | public: 710 | SWd val; 711 | 712 | void init(SWd _val) { 713 | Obj::init(TNum); 714 | val = _val; 715 | log_set_val(&val, val); 716 | } 717 | 718 | void set(SWd _val) { 719 | val = _val; 720 | log_set_val(&val, val); 721 | } 722 | 723 | UWd size() const { return size_needed(); } 724 | 725 | SWd to_i() const { 726 | log_get_val(&val); 727 | return val; 728 | } 729 | 730 | void dump() const { std::cout << val; } 731 | static UWd size_needed() { return sizeof(Num) / sizeof(UWd); } 732 | }; 733 | 734 | class NumRef: public ObjRef { 735 | public: 736 | Num *cast_Num() const { return (Num *)referenced_Obj(); } 737 | NumRef(SWd val = 0) : ObjRef(ALLOC, Num::size_needed()) { 738 | cast_Num()->init(val); 739 | } 740 | 741 | void set(SWd val) { cast_Num()->set(val); } 742 | }; 743 | 744 | class Tup: public Obj { 745 | public: 746 | UWd len; 747 | Loc val[]; 748 | 749 | void init(int _len) { 750 | Obj::init(TTup); 751 | len = _len; 752 | log_set_val(&len, len); 753 | // due to the shallow copy constructor, there may be initial 754 | // values in this tuple which need their ref counts bumped. 755 | for (int i = 0; i < len; ++i) { 756 | if (val[i]) { 757 | Obj::at(val[i])->inc_ref_count(); 758 | } 759 | } 760 | } 761 | 762 | static Tup *at(Loc loc) { return (Tup *)Obj::at(loc); } 763 | 764 | ObjRef get(int i) const { 765 | assert(i < len); 766 | log_get_val(&val[i]); 767 | return ObjRef::at(val[i]); 768 | } 769 | 770 | void set(int i, ObjRef obj) { 771 | assert(i < len); 772 | // always increment the ref count before decrementing 773 | // otherwise self-assignment will fail. 774 | Loc tmp = obj.share(); 775 | ObjRef::unshare(val[i]); 776 | val[i] = tmp; 777 | log_set_ref(val + i, val[i]); 778 | } 779 | 780 | void traverse(VisitFn f) const { 781 | for (int i = 0; i < len; ++i) { 782 | log_get_val(&val[i]); 783 | f(val[i]); 784 | Obj::at(val[i])->traverse(f); 785 | } 786 | } 787 | 788 | void fixup_references() { 789 | for (int i = 0; i < len; ++i) { 790 | val[i] = Mem::loc_after_move(val[i]); 791 | } 792 | } 793 | 794 | void cleanup() { 795 | for (int i = 0; i < len; ++i) { 796 | ObjRef::unshare(val[i]); 797 | val[i] = 0; 798 | } 799 | } 800 | 801 | UWd size() const { return size_needed(len); } 802 | void dump_up_to(int max) const { 803 | std::cout << '['; 804 | for (int i = 0; i < max; ++i) { 805 | if (i > 0) { 806 | std::cout << ','; 807 | } 808 | Obj::at(val[i])->dump(); 809 | } 810 | std::cout << ']'; 811 | } 812 | void dump() const { dump_up_to(len); } 813 | static UWd size_needed(int len) { return sizeof(Tup) / sizeof(UWd) + len; } 814 | }; 815 | 816 | class TupRef: public ObjRef { 817 | public: 818 | Tup *cast_Tup() const { return (Tup *)referenced_Obj(); } 819 | TupRef(int len = 2) : ObjRef(ALLOC, Tup::size_needed(len)) { 820 | cast_Tup()->init(len); 821 | } 822 | // FIXME busted if a GC happens during a copy 823 | TupRef(Loc src, int len) : ObjRef(COPY, src, Tup::size_needed(len)) { 824 | cast_Tup()->init(len); 825 | } 826 | 827 | int length() const { return cast_Tup()->len; } 828 | ObjRef get(int i) const { return cast_Tup()->get(i); } 829 | void set(int i, ObjRef obj) { cast_Tup()->set(i, obj); } 830 | }; 831 | 832 | class Vec: public Obj { 833 | public: 834 | UWd len; 835 | Loc tup; 836 | 837 | void init(Loc _tup) { 838 | Obj::init(TVec); 839 | len = 0; 840 | tup = _tup; // caller already incremented ref count 841 | log_set_val(&len, len); 842 | log_set_ref(&tup, tup); 843 | } 844 | 845 | ObjRef get(int i) const { 846 | assert(i < len); 847 | log_get_val(&tup); 848 | return Tup::at(tup)->get(i); 849 | } 850 | 851 | ObjRef get(int i, int j) const { 852 | ObjRef inner = get(i); 853 | assert(inner.type() == TTup || inner.type() == TVec); 854 | if (inner.type() == TTup) { 855 | Tup *inner_tup = (Tup *)inner.referenced_Obj(); 856 | return inner_tup->get(j); 857 | } 858 | else { 859 | Vec *inner_vec = (Vec *)inner.referenced_Obj(); 860 | return inner_vec->get(j); 861 | } 862 | } 863 | 864 | void set(int i, ObjRef obj) { 865 | assert(i < len); 866 | log_get_val(&tup); 867 | Tup::at(tup)->set(i, obj); 868 | } 869 | 870 | void traverse(VisitFn f) const { 871 | log_get_val(&tup); 872 | f(tup); 873 | Tup::at(tup)->traverse(f); 874 | } 875 | 876 | void fixup_references() { 877 | tup = Mem::loc_after_move(tup); 878 | } 879 | 880 | void cleanup() { 881 | ObjRef::unshare(tup); 882 | tup = 0; 883 | } 884 | 885 | UWd size() const { return size_needed(len); } 886 | void dump() const { Tup::at(tup)->dump_up_to(len); } 887 | static UWd size_needed(int len) { return sizeof(Vec) / sizeof(UWd); } 888 | }; 889 | 890 | class VecRef: public ObjRef { 891 | public: 892 | Vec *cast_Vec() const { return (Vec *)referenced_Obj(); } 893 | VecRef(int size = 1) : ObjRef(ALLOC, Vec::size_needed(size)) { 894 | Loc tup = TupRef(size).share(); 895 | cast_Vec()->init(tup); 896 | } 897 | VecRef(ObjRef that) : ObjRef(that) { 898 | assert(that.type() == Obj::TVec); 899 | } 900 | 901 | int length() const { return cast_Vec()->len; } 902 | ObjRef get(int i) const { return cast_Vec()->get(i); } 903 | ObjRef get(int i, int j) const { return cast_Vec()->get(i, j); } 904 | void set(int i, ObjRef obj) { cast_Vec()->set(i, obj); } 905 | 906 | void push(ObjRef obj) { 907 | std::cout << "// push "; obj.dump(); std::cout << '\n'; 908 | Vec *vec = cast_Vec(); 909 | Tup *tup = Tup::at(vec->tup); 910 | if (tup->len == vec->len) { 911 | Loc new_tup = TupRef(vec->tup, 2 * vec->len).share(); 912 | vec = cast_Vec(); 913 | ObjRef::unshare(vec->tup); 914 | vec->tup = new_tup; 915 | tup = Tup::at(vec->tup); 916 | log_set_ref(&vec->tup, vec->tup); 917 | } 918 | tup->set(vec->len, obj); 919 | vec->len += 1; 920 | log_set_val(&vec->len, vec->len); 921 | } 922 | 923 | bool contains(int j, const ObjRef &obj) { 924 | Vec *vec = cast_Vec(); 925 | for (int i = 0; i < vec->len; ++i) { 926 | ObjRef other = vec->get(i, j); 927 | if (obj.equals(other)) { 928 | return true; 929 | } 930 | } 931 | return false; 932 | } 933 | }; 934 | 935 | class Str: public Obj { 936 | public: 937 | UWd len; 938 | UWd val[]; // array of char 939 | 940 | void init(std::string data) { 941 | Obj::init(TStr); 942 | len = data.length(); 943 | log_set_val(&len, len); 944 | for (int i = 0; i < len; ++i) { 945 | val[i] = data[i]; 946 | log_set_val(val + i, data[i]); 947 | } 948 | } 949 | 950 | void init(int _len) { 951 | Obj::init(TStr); 952 | len = _len; 953 | log_set_val(&len, len); 954 | } 955 | 956 | int split(char sep, int begin[], int end[]) { 957 | int found = 0; 958 | int last = 0; 959 | for (int i = 0; i < len; ++i) { 960 | log_get_val(&val[i]); 961 | if (val[i] == sep) { 962 | begin[found] = last; 963 | end[found] = i; 964 | last = i + 1; 965 | ++found; 966 | } 967 | } 968 | begin[found] = last; 969 | end[found] = len; 970 | return found + 1; 971 | } 972 | 973 | void copy(int begin, int end, Str *dest) { 974 | for (int i = 0; i < end - begin; ++i) { 975 | dest->val[i] = val[begin + i]; 976 | } 977 | log_copy_mem(dest->val, val + begin, end - begin); 978 | } 979 | 980 | UWd size() { 981 | return size_needed(len); 982 | } 983 | 984 | SWd to_i() { 985 | SWd n = 0; 986 | int sign = 1; 987 | int i = 0; 988 | while (i < len) { 989 | log_get_val(&val[i]); 990 | if (val[i] == '-') { 991 | sign = -sign; 992 | ++i; 993 | } 994 | else { 995 | break; 996 | } 997 | } 998 | while (i < len) { 999 | log_get_val(&val[i]); 1000 | if ('0' <= val[i] && val[i] <= '9') { 1001 | n = n * 10 + (val[i] - '0'); 1002 | ++i; 1003 | } 1004 | else { 1005 | break; 1006 | } 1007 | } 1008 | return sign * n; 1009 | } 1010 | 1011 | void dump() { 1012 | std::cout << '"'; 1013 | for (int i = 0; i < len; ++i) { 1014 | std::cout << char(val[i]); 1015 | } 1016 | std::cout << '"'; 1017 | } 1018 | 1019 | static UWd size_needed(int len) { 1020 | return sizeof(Str) / sizeof(UWd) + len; 1021 | } 1022 | 1023 | static UWd size_needed(std::string data) { 1024 | return sizeof(Str) / sizeof(UWd) + data.length(); 1025 | } 1026 | }; 1027 | 1028 | class StrRef: public ObjRef { 1029 | public: 1030 | Str *cast_Str() const { return (Str *)referenced_Obj(); } 1031 | StrRef(std::string data) : ObjRef(ALLOC, Str::size_needed(data)) { 1032 | cast_Str()->init(data); 1033 | } 1034 | 1035 | StrRef(int len) : ObjRef(ALLOC, Str::size_needed(len)) { 1036 | cast_Str()->init(len); 1037 | } 1038 | 1039 | VecRef split(char sep) { 1040 | int begin[5]; 1041 | int end[5]; 1042 | int count = cast_Str()->split(sep, begin, end); 1043 | VecRef fields(count); 1044 | for (int i = 0; i < count; ++i) { 1045 | StrRef substr(end[i] - begin[i]); 1046 | cast_Str()->copy(begin[i], end[i], substr.cast_Str()); 1047 | fields.push(substr); 1048 | } 1049 | return fields; 1050 | } 1051 | }; 1052 | 1053 | // enum Type { TNil=0, TForward=1, TFree=2, TNum=3, TTup=4, TVec=5, TStr=6 }; 1054 | const char *Obj::TypeName[] = { ":nil ", ":* ", ":- ", ":n ", ":<> ", ":[] ", ":s " }; 1055 | 1056 | Obj *Obj::at(Loc loc) { 1057 | return (Obj *)(Mem::heap + loc); 1058 | } 1059 | 1060 | void Obj::traverse(VisitFn f) const { 1061 | switch (type()) { 1062 | case TTup: 1063 | return ((Tup *)this)->traverse(f); 1064 | case TVec: 1065 | return ((Vec *)this)->traverse(f); 1066 | default: 1067 | return; 1068 | } 1069 | } 1070 | 1071 | void Obj::fixup_references() { 1072 | switch (type()) { 1073 | case TTup: 1074 | return ((Tup *)this)->fixup_references(); 1075 | case TVec: 1076 | return ((Vec *)this)->fixup_references(); 1077 | default: 1078 | return; 1079 | } 1080 | } 1081 | 1082 | void Obj::cleanup() { 1083 | switch (type()) { 1084 | case TTup: 1085 | return ((Tup *)this)->cleanup(); 1086 | case TVec: 1087 | return ((Vec *)this)->cleanup(); 1088 | default: 1089 | return; 1090 | } 1091 | } 1092 | 1093 | UWd Obj::size() const { 1094 | switch (type()) { 1095 | case TNum: 1096 | return ((Num *)this)->size(); 1097 | case TTup: 1098 | return ((Tup *)this)->size(); 1099 | case TVec: 1100 | return ((Vec *)this)->size(); 1101 | case TStr: 1102 | return ((Str *)this)->size(); 1103 | case TFree: 1104 | return ((FreeBlock *)this)->size(); 1105 | default: 1106 | assert(type() != TForward); 1107 | return 1; 1108 | } 1109 | } 1110 | 1111 | SWd Obj::to_i() const { 1112 | switch (type()) { 1113 | case TNum: 1114 | return ((Num *)this)->to_i(); 1115 | case TStr: 1116 | return ((Str *)this)->to_i(); 1117 | default: 1118 | return 0; 1119 | } 1120 | } 1121 | 1122 | bool Obj::equals(const Obj *that) const { 1123 | switch (type()) { 1124 | case TNum: 1125 | if (that->type() == TNum) { 1126 | const Num *a = ((const Num *)this); 1127 | const Num *b = ((const Num *)that); 1128 | return a->val == b->val; 1129 | } 1130 | return false; 1131 | case TStr: 1132 | if (that->type() == TStr) { 1133 | const Str *a = ((const Str *)this); 1134 | const Str *b = ((const Str *)that); 1135 | return a->len == b->len && (a->len == 0 || a->val[0] == b->val[0]); 1136 | } 1137 | return false; 1138 | default: 1139 | return false; 1140 | } 1141 | } 1142 | 1143 | void Obj::dump() const { 1144 | switch (type()) { 1145 | case TNil: 1146 | std::cout << "nil"; 1147 | break; 1148 | case TNum: 1149 | ((Num *)this)->dump(); 1150 | break; 1151 | case TTup: 1152 | ((Tup *)this)->dump(); 1153 | break; 1154 | case TVec: 1155 | ((Vec *)this)->dump(); 1156 | break; 1157 | case TStr: 1158 | ((Str *)this)->dump(); 1159 | break; 1160 | default: 1161 | std::cout << ""; 1162 | break; 1163 | } 1164 | } 1165 | 1166 | /* The C++ main is a close analogue of this Ruby code: 1167 | 1168 | dkp_log = File.foreach("dkp.log").map { |line| 1169 | amount, person, thing = line.strip.split(",") 1170 | [ amount.to_i, person, thing ] 1171 | } 1172 | 1173 | standings = dkp_log.group_by { |trans| trans[1] }.map { |person, history| 1174 | [ person, history.reduce(0) { |sum, trans| sum + trans[0] } ] 1175 | }.sort { |a, b| b[1] <=> a[1] } 1176 | 1177 | */ 1178 | 1179 | int main(int argc, char **argv) { 1180 | const char *dkp_file_name = (argc == 2 && argv[1]) ? argv[1] : "data/dkp.log-small"; 1181 | 1182 | assert(Num::size_needed() == 2); 1183 | assert(Str::size_needed("hello") == 7); 1184 | assert(Tup::size_needed(5) == 7); 1185 | assert(Vec::size_needed(5) == 3); 1186 | 1187 | Mem::info[0].was_allocated(); 1188 | Mem::top = 1; // heap[0] is nil 1189 | 1190 | std::cout << "var frame_content = [\n"; 1191 | log_start(); 1192 | 1193 | VecRef *dkp_log = new VecRef(); 1194 | int bp = 0; 1195 | 1196 | std::ifstream dkp_file; 1197 | dkp_file.open(dkp_file_name); 1198 | for (std::string data; std::getline(dkp_file, data); ) { 1199 | std::cout << "// line: " << data << '\n'; 1200 | StrRef line(data); // allocate input line 1201 | VecRef field(line.split(',')); // split into Vec of Str 1202 | TupRef trans(3); // allocate 3 tuple 1203 | NumRef amt(field.get(0).to_i()); // convert field 1 to num 1204 | trans.set(0, amt); // trans[0] = Num 1205 | trans.set(1, field.get(1)); // trans[1] = Str 1206 | trans.set(2, field.get(2)); // trans[2] = Str 1207 | dkp_log->push(trans); 1208 | if (bp++ == 1) { 1209 | Mem::log_roots("line parsed"); 1210 | } 1211 | if (bp % 5 == 0) { 1212 | Mem::gc(); 1213 | } 1214 | } 1215 | dkp_file.close(); 1216 | 1217 | Mem::log_roots("file parsed"); 1218 | std::cout << "// "; dkp_log->dump(); std::cout << '\n'; 1219 | 1220 | int dkp_log_length = dkp_log->length(); 1221 | VecRef *dkp_group = new VecRef(); 1222 | bp = 0; 1223 | 1224 | for (int i = 0; i < dkp_log_length; ++i) { 1225 | if (!dkp_group->contains(0, dkp_log->get(i, 1))) { 1226 | TupRef person(2); 1227 | person.set(0, dkp_log->get(i, 1)); 1228 | VecRef history; 1229 | person.set(1, history); 1230 | dkp_group->push(person); 1231 | for (int j = i; j < dkp_log_length; ++j) { 1232 | if (dkp_log->get(j, 1).equals(person.get(0))) { 1233 | history.push(dkp_log->get(j)); 1234 | } 1235 | } 1236 | if (bp++ == 1) { 1237 | Mem::log_roots("group found"); 1238 | } 1239 | } 1240 | } 1241 | 1242 | delete dkp_log; 1243 | dkp_log = 0; 1244 | 1245 | Mem::gc(); 1246 | 1247 | Mem::log_roots("data grouped"); 1248 | std::cout << "// "; dkp_group->dump(); std::cout << '\n'; 1249 | bp = 0; 1250 | 1251 | int dkp_group_length = dkp_group->length(); 1252 | VecRef *dkp_standing = new VecRef(); 1253 | 1254 | for (int i = 0; i < dkp_group_length; ++i) { 1255 | TupRef person(2); 1256 | person.set(0, dkp_group->get(i, 0)); 1257 | VecRef history = dkp_group->get(i, 1); 1258 | int sum = 0; 1259 | NumRef final(sum); 1260 | for (int j = 0; j < history.length(); ++j) { 1261 | NumRef tmp(sum + history.get(j, 0).to_i()); 1262 | sum = tmp.to_i(); 1263 | } 1264 | final.set(sum); 1265 | person.set(1, final); 1266 | dkp_standing->push(person); 1267 | if (bp++ == 1) { 1268 | Mem::log_roots("transaction history reduced"); 1269 | } 1270 | } 1271 | 1272 | delete dkp_group; 1273 | dkp_group = 0; 1274 | 1275 | Mem::gc(); 1276 | 1277 | int dkp_standing_length = dkp_standing->length(); 1278 | VecRef *dkp_rank = new VecRef(dkp_standing_length); 1279 | 1280 | // world's most terrible sort 1281 | for (int rank = 20; rank >= 0; --rank) { 1282 | for (int i = 0; i < dkp_standing_length; ++i) { 1283 | if (dkp_standing->get(i, 1).to_i() == rank) { 1284 | dkp_rank->push(dkp_standing->get(i)); 1285 | } 1286 | } 1287 | } 1288 | 1289 | delete dkp_standing; 1290 | dkp_standing = 0; 1291 | 1292 | Mem::gc(); 1293 | 1294 | Mem::log_roots("ranking finished"); 1295 | std::cout << "// "; dkp_rank->dump(); std::cout << '\n'; 1296 | log_stop(); 1297 | std::cout << "['stop']];\n"; 1298 | 1299 | delete dkp_rank; 1300 | dkp_rank = 0; 1301 | 1302 | return 0; 1303 | } 1304 | -------------------------------------------------------------------------------- /docs/frames.js: -------------------------------------------------------------------------------- 1 | var frame_content = [ 2 | ['alloc',1,3], 3 | ['alloc',4,3], 4 | ['init',4,':<> '], 5 | ['set',5,'=1'], 6 | ['init',1,':[] '], 7 | ['set',2,'=0'], 8 | ['set',3,4], 9 | // line: 10,Mal,Temple of the Jade Serpent 10 | ['alloc',7,35], 11 | ['init',7,':s '], 12 | ['set',8,'=33'], 13 | ['set',9,"'1"], 14 | ['set',10,"'0"], 15 | ['set',11,"',"], 16 | ['set',12,"'M"], 17 | ['set',13,"'a"], 18 | ['set',14,"'l"], 19 | ['set',15,"',"], 20 | ['set',16,"'T"], 21 | ['set',17,"'e"], 22 | ['set',18,"'m"], 23 | ['set',19,"'p"], 24 | ['set',20,"'l"], 25 | ['set',21,"'e"], 26 | ['set',22,"' "], 27 | ['set',23,"'o"], 28 | ['set',24,"'f"], 29 | ['set',25,"' "], 30 | ['set',26,"'t"], 31 | ['set',27,"'h"], 32 | ['set',28,"'e"], 33 | ['set',29,"' "], 34 | ['set',30,"'J"], 35 | ['set',31,"'a"], 36 | ['set',32,"'d"], 37 | ['set',33,"'e"], 38 | ['set',34,"' "], 39 | ['set',35,"'S"], 40 | ['set',36,"'e"], 41 | ['set',37,"'r"], 42 | ['set',38,"'p"], 43 | ['set',39,"'e"], 44 | ['set',40,"'n"], 45 | ['set',41,"'t"], 46 | ['alloc',42,3], 47 | ['alloc',45,5], 48 | ['init',45,':<> '], 49 | ['set',46,'=3'], 50 | ['init',42,':[] '], 51 | ['set',43,'=0'], 52 | ['set',44,45], 53 | ['alloc',50,4], 54 | ['init',50,':s '], 55 | ['set',51,'=2'], 56 | ['copy',52,9,2], 57 | // push "10" 58 | ['set',47,50], 59 | ['set',43,'=1'], 60 | ['alloc',54,5], 61 | ['init',54,':s '], 62 | ['set',55,'=3'], 63 | ['copy',56,12,3], 64 | // push "Mal" 65 | ['set',48,54], 66 | ['set',43,'=2'], 67 | ['alloc',59,28], 68 | ['init',59,':s '], 69 | ['set',60,'=26'], 70 | ['copy',61,16,26], 71 | // push "Temple of the Jade Serpent" 72 | ['set',49,59], 73 | ['set',43,'=3'], 74 | ['alloc',87,5], 75 | ['init',87,':<> '], 76 | ['set',88,'=3'], 77 | ['alloc',92,2], 78 | ['init',92,':n '], 79 | ['set',93,'=10'], 80 | ['set',89,92], 81 | ['set',90,54], 82 | ['set',91,59], 83 | // push [10,"Mal","Temple of the Jade Serpent"] 84 | ['set',6,87], 85 | ['set',2,'=1'], 86 | // line: 10,Wash,Temple of the Jade Serpent 87 | ['alloc',94,36], 88 | ['init',94,':s '], 89 | ['set',95,'=34'], 90 | ['set',96,"'1"], 91 | ['set',97,"'0"], 92 | ['set',98,"',"], 93 | ['set',99,"'W"], 94 | ['set',100,"'a"], 95 | ['set',101,"'s"], 96 | ['set',102,"'h"], 97 | ['set',103,"',"], 98 | ['set',104,"'T"], 99 | ['set',105,"'e"], 100 | ['set',106,"'m"], 101 | ['set',107,"'p"], 102 | ['set',108,"'l"], 103 | ['set',109,"'e"], 104 | ['set',110,"' "], 105 | ['set',111,"'o"], 106 | ['set',112,"'f"], 107 | ['set',113,"' "], 108 | ['set',114,"'t"], 109 | ['set',115,"'h"], 110 | ['set',116,"'e"], 111 | ['set',117,"' "], 112 | ['set',118,"'J"], 113 | ['set',119,"'a"], 114 | ['set',120,"'d"], 115 | ['set',121,"'e"], 116 | ['set',122,"' "], 117 | ['set',123,"'S"], 118 | ['set',124,"'e"], 119 | ['set',125,"'r"], 120 | ['set',126,"'p"], 121 | ['set',127,"'e"], 122 | ['set',128,"'n"], 123 | ['set',129,"'t"], 124 | ['alloc',130,3], 125 | ['alloc',133,5], 126 | ['init',133,':<> '], 127 | ['set',134,'=3'], 128 | ['init',130,':[] '], 129 | ['set',131,'=0'], 130 | ['set',132,133], 131 | ['alloc',138,4], 132 | ['init',138,':s '], 133 | ['set',139,'=2'], 134 | ['copy',140,96,2], 135 | // push "10" 136 | ['set',135,138], 137 | ['set',131,'=1'], 138 | ['alloc',142,6], 139 | ['init',142,':s '], 140 | ['set',143,'=4'], 141 | ['copy',144,99,4], 142 | // push "Wash" 143 | ['set',136,142], 144 | ['set',131,'=2'], 145 | ['alloc',148,28], 146 | ['init',148,':s '], 147 | ['set',149,'=26'], 148 | ['copy',150,104,26], 149 | // push "Temple of the Jade Serpent" 150 | ['set',137,148], 151 | ['set',131,'=3'], 152 | ['alloc',176,5], 153 | ['init',176,':<> '], 154 | ['set',177,'=3'], 155 | ['alloc',181,2], 156 | ['init',181,':n '], 157 | ['set',182,'=10'], 158 | ['set',178,181], 159 | ['set',179,142], 160 | ['set',180,148], 161 | // push [10,"Wash","Temple of the Jade Serpent"] 162 | ['alloc',183,4], 163 | ['copy',183,4,3], 164 | ['init',183,':<> '], 165 | ['set',184,'=2'], 166 | ['set',3,183], 167 | ['set',186,176], 168 | ['set',2,'=2'], 169 | ['bp','line parsed'], 170 | ['roots',181,176,130,94,1,0], 171 | ['live',0,1,54,59,87,92,94,130,133,138,142,148,176,181,183], 172 | // line: 10,Zoe,Temple of the Jade Serpent 173 | ['alloc',187,35], 174 | ['init',187,':s '], 175 | ['set',188,'=33'], 176 | ['set',189,"'1"], 177 | ['set',190,"'0"], 178 | ['set',191,"',"], 179 | ['set',192,"'Z"], 180 | ['set',193,"'o"], 181 | ['set',194,"'e"], 182 | ['set',195,"',"], 183 | ['set',196,"'T"], 184 | ['set',197,"'e"], 185 | ['set',198,"'m"], 186 | ['set',199,"'p"], 187 | ['set',200,"'l"], 188 | ['set',201,"'e"], 189 | ['set',202,"' "], 190 | ['set',203,"'o"], 191 | ['set',204,"'f"], 192 | ['set',205,"' "], 193 | ['set',206,"'t"], 194 | ['set',207,"'h"], 195 | ['set',208,"'e"], 196 | ['set',209,"' "], 197 | ['set',210,"'J"], 198 | ['set',211,"'a"], 199 | ['set',212,"'d"], 200 | ['set',213,"'e"], 201 | ['set',214,"' "], 202 | ['set',215,"'S"], 203 | ['set',216,"'e"], 204 | ['set',217,"'r"], 205 | ['set',218,"'p"], 206 | ['set',219,"'e"], 207 | ['set',220,"'n"], 208 | ['set',221,"'t"], 209 | ['alloc',222,3], 210 | ['alloc',225,5], 211 | ['init',225,':<> '], 212 | ['set',226,'=3'], 213 | ['init',222,':[] '], 214 | ['set',223,'=0'], 215 | ['set',224,225], 216 | ['alloc',230,4], 217 | ['init',230,':s '], 218 | ['set',231,'=2'], 219 | ['copy',232,189,2], 220 | // push "10" 221 | ['set',227,230], 222 | ['set',223,'=1'], 223 | ['alloc',234,5], 224 | ['init',234,':s '], 225 | ['set',235,'=3'], 226 | ['copy',236,192,3], 227 | // push "Zoe" 228 | ['set',228,234], 229 | ['set',223,'=2'], 230 | ['alloc',239,28], 231 | ['init',239,':s '], 232 | ['set',240,'=26'], 233 | ['copy',241,196,26], 234 | // push "Temple of the Jade Serpent" 235 | ['set',229,239], 236 | ['set',223,'=3'], 237 | ['alloc',267,5], 238 | ['init',267,':<> '], 239 | ['set',268,'=3'], 240 | ['alloc',272,2], 241 | ['init',272,':n '], 242 | ['set',273,'=10'], 243 | ['set',269,272], 244 | ['set',270,234], 245 | ['set',271,239], 246 | // push [10,"Zoe","Temple of the Jade Serpent"] 247 | ['alloc',274,6], 248 | ['copy',274,183,4], 249 | ['init',274,':<> '], 250 | ['set',275,'=4'], 251 | ['set',3,274], 252 | ['set',278,267], 253 | ['set',2,'=3'], 254 | // line: 10,Jayne,Temple of the Jade Serpent 255 | ['alloc',280,37], 256 | ['init',280,':s '], 257 | ['set',281,'=35'], 258 | ['set',282,"'1"], 259 | ['set',283,"'0"], 260 | ['set',284,"',"], 261 | ['set',285,"'J"], 262 | ['set',286,"'a"], 263 | ['set',287,"'y"], 264 | ['set',288,"'n"], 265 | ['set',289,"'e"], 266 | ['set',290,"',"], 267 | ['set',291,"'T"], 268 | ['set',292,"'e"], 269 | ['set',293,"'m"], 270 | ['set',294,"'p"], 271 | ['set',295,"'l"], 272 | ['set',296,"'e"], 273 | ['set',297,"' "], 274 | ['set',298,"'o"], 275 | ['set',299,"'f"], 276 | ['set',300,"' "], 277 | ['set',301,"'t"], 278 | ['set',302,"'h"], 279 | ['set',303,"'e"], 280 | ['set',304,"' "], 281 | ['set',305,"'J"], 282 | ['set',306,"'a"], 283 | ['set',307,"'d"], 284 | ['set',308,"'e"], 285 | ['set',309,"' "], 286 | ['set',310,"'S"], 287 | ['set',311,"'e"], 288 | ['set',312,"'r"], 289 | ['set',313,"'p"], 290 | ['set',314,"'e"], 291 | ['set',315,"'n"], 292 | ['set',316,"'t"], 293 | ['alloc',317,3], 294 | ['alloc',320,5], 295 | ['init',320,':<> '], 296 | ['set',321,'=3'], 297 | ['init',317,':[] '], 298 | ['set',318,'=0'], 299 | ['set',319,320], 300 | ['alloc',325,4], 301 | ['init',325,':s '], 302 | ['set',326,'=2'], 303 | ['copy',327,282,2], 304 | // push "10" 305 | ['set',322,325], 306 | ['set',318,'=1'], 307 | ['alloc',329,7], 308 | ['init',329,':s '], 309 | ['set',330,'=5'], 310 | ['copy',331,285,5], 311 | // push "Jayne" 312 | ['set',323,329], 313 | ['set',318,'=2'], 314 | ['alloc',336,28], 315 | ['init',336,':s '], 316 | ['set',337,'=26'], 317 | ['copy',338,291,26], 318 | // push "Temple of the Jade Serpent" 319 | ['set',324,336], 320 | ['set',318,'=3'], 321 | ['alloc',364,5], 322 | ['init',364,':<> '], 323 | ['set',365,'=3'], 324 | ['alloc',369,2], 325 | ['init',369,':n '], 326 | ['set',370,'=10'], 327 | ['set',366,369], 328 | ['set',367,329], 329 | ['set',368,336], 330 | // push [10,"Jayne","Temple of the Jade Serpent"] 331 | ['set',279,364], 332 | ['set',2,'=4'], 333 | // line: 10,Kaylee,Temple of the Jade Serpent 334 | ['alloc',371,38], 335 | ['init',371,':s '], 336 | ['set',372,'=36'], 337 | ['set',373,"'1"], 338 | ['set',374,"'0"], 339 | ['set',375,"',"], 340 | ['set',376,"'K"], 341 | ['set',377,"'a"], 342 | ['set',378,"'y"], 343 | ['set',379,"'l"], 344 | ['set',380,"'e"], 345 | ['set',381,"'e"], 346 | ['set',382,"',"], 347 | ['set',383,"'T"], 348 | ['set',384,"'e"], 349 | ['set',385,"'m"], 350 | ['set',386,"'p"], 351 | ['set',387,"'l"], 352 | ['set',388,"'e"], 353 | ['set',389,"' "], 354 | ['set',390,"'o"], 355 | ['set',391,"'f"], 356 | ['set',392,"' "], 357 | ['set',393,"'t"], 358 | ['set',394,"'h"], 359 | ['set',395,"'e"], 360 | ['set',396,"' "], 361 | ['set',397,"'J"], 362 | ['set',398,"'a"], 363 | ['set',399,"'d"], 364 | ['set',400,"'e"], 365 | ['set',401,"' "], 366 | ['set',402,"'S"], 367 | ['set',403,"'e"], 368 | ['set',404,"'r"], 369 | ['set',405,"'p"], 370 | ['set',406,"'e"], 371 | ['set',407,"'n"], 372 | ['set',408,"'t"], 373 | ['alloc',409,3], 374 | ['alloc',412,5], 375 | ['init',412,':<> '], 376 | ['set',413,'=3'], 377 | ['init',409,':[] '], 378 | ['set',410,'=0'], 379 | ['set',411,412], 380 | ['alloc',417,4], 381 | ['init',417,':s '], 382 | ['set',418,'=2'], 383 | ['copy',419,373,2], 384 | // push "10" 385 | ['set',414,417], 386 | ['set',410,'=1'], 387 | ['alloc',421,8], 388 | ['init',421,':s '], 389 | ['set',422,'=6'], 390 | ['copy',423,376,6], 391 | // push "Kaylee" 392 | ['set',415,421], 393 | ['set',410,'=2'], 394 | ['alloc',429,28], 395 | ['init',429,':s '], 396 | ['set',430,'=26'], 397 | ['copy',431,383,26], 398 | // push "Temple of the Jade Serpent" 399 | ['set',416,429], 400 | ['set',410,'=3'], 401 | ['alloc',457,5], 402 | ['init',457,':<> '], 403 | ['set',458,'=3'], 404 | ['alloc',462,2], 405 | ['init',462,':n '], 406 | ['set',463,'=10'], 407 | ['set',459,462], 408 | ['set',460,421], 409 | ['set',461,429], 410 | // push [10,"Kaylee","Temple of the Jade Serpent"] 411 | ['alloc',464,10], 412 | ['copy',464,274,6], 413 | ['init',464,':<> '], 414 | ['set',465,'=8'], 415 | ['set',3,464], 416 | ['set',470,457], 417 | ['set',2,'=5'], 418 | ['ref_count',462,1], 419 | ['ref_count',457,1], 420 | ['ref_count',462,1], 421 | ['ref_count',421,1], 422 | ['ref_count',429,1], 423 | ['ref_count',409,1], 424 | ['ref_count',412,1], 425 | ['ref_count',417,1], 426 | ['ref_count',421,1], 427 | ['ref_count',429,1], 428 | ['ref_count',371,1], 429 | ['ref_count',1,1], 430 | ['ref_count',464,1], 431 | ['ref_count',87,1], 432 | ['ref_count',92,1], 433 | ['ref_count',54,1], 434 | ['ref_count',59,1], 435 | ['ref_count',176,1], 436 | ['ref_count',181,1], 437 | ['ref_count',142,1], 438 | ['ref_count',148,1], 439 | ['ref_count',267,1], 440 | ['ref_count',272,1], 441 | ['ref_count',234,1], 442 | ['ref_count',239,1], 443 | ['ref_count',364,1], 444 | ['ref_count',369,1], 445 | ['ref_count',329,1], 446 | ['ref_count',336,1], 447 | ['ref_count',457,1], 448 | ['ref_count',462,1], 449 | ['ref_count',421,1], 450 | ['ref_count',429,1], 451 | ['init',4,':- '], 452 | ['free',4,3], 453 | ['init',7,':- '], 454 | ['free',7,35], 455 | ['init',42,':- '], 456 | ['free',42,3], 457 | ['init',45,':- '], 458 | ['free',45,5], 459 | ['init',50,':- '], 460 | ['free',50,4], 461 | ['init',94,':- '], 462 | ['free',94,36], 463 | ['init',130,':- '], 464 | ['free',130,3], 465 | ['init',133,':- '], 466 | ['free',133,5], 467 | ['init',138,':- '], 468 | ['free',138,4], 469 | ['init',183,':- '], 470 | ['free',183,4], 471 | ['init',187,':- '], 472 | ['free',187,35], 473 | ['init',222,':- '], 474 | ['free',222,3], 475 | ['init',225,':- '], 476 | ['free',225,5], 477 | ['init',230,':- '], 478 | ['free',230,4], 479 | ['init',274,':- '], 480 | ['free',274,6], 481 | ['init',280,':- '], 482 | ['free',280,37], 483 | ['init',317,':- '], 484 | ['free',317,3], 485 | ['init',320,':- '], 486 | ['free',320,5], 487 | ['init',325,':- '], 488 | ['free',325,4], 489 | // line: -3,Mal,Pistol 490 | ['alloc',474,15], 491 | ['init',474,':s '], 492 | ['set',475,'=13'], 493 | ['set',476,"'-"], 494 | ['set',477,"'3"], 495 | ['set',478,"',"], 496 | ['set',479,"'M"], 497 | ['set',480,"'a"], 498 | ['set',481,"'l"], 499 | ['set',482,"',"], 500 | ['set',483,"'P"], 501 | ['set',484,"'i"], 502 | ['set',485,"'s"], 503 | ['set',486,"'t"], 504 | ['set',487,"'o"], 505 | ['set',488,"'l"], 506 | ['alloc',489,3], 507 | ['alloc',492,5], 508 | ['init',492,':<> '], 509 | ['set',493,'=3'], 510 | ['init',489,':[] '], 511 | ['set',490,'=0'], 512 | ['set',491,492], 513 | ['alloc',497,4], 514 | ['init',497,':s '], 515 | ['set',498,'=2'], 516 | ['copy',499,476,2], 517 | // push "-3" 518 | ['set',494,497], 519 | ['set',490,'=1'], 520 | ['alloc',501,5], 521 | ['init',501,':s '], 522 | ['set',502,'=3'], 523 | ['copy',503,479,3], 524 | // push "Mal" 525 | ['set',495,501], 526 | ['set',490,'=2'], 527 | ['alloc',506,8], 528 | ['init',506,':s '], 529 | ['set',507,'=6'], 530 | ['copy',508,483,6], 531 | // push "Pistol" 532 | ['set',496,506], 533 | ['set',490,'=3'], 534 | ['alloc',514,5], 535 | ['init',514,':<> '], 536 | ['set',515,'=3'], 537 | ['alloc',519,2], 538 | ['init',519,':n '], 539 | ['set',520,'=-3'], 540 | ['set',516,519], 541 | ['set',517,501], 542 | ['set',518,506], 543 | // push [-3,"Mal","Pistol"] 544 | ['set',471,514], 545 | ['set',2,'=6'], 546 | // line: -3,Wash,Hawaiian Shirt 547 | ['alloc',521,24], 548 | ['init',521,':s '], 549 | ['set',522,'=22'], 550 | ['set',523,"'-"], 551 | ['set',524,"'3"], 552 | ['set',525,"',"], 553 | ['set',526,"'W"], 554 | ['set',527,"'a"], 555 | ['set',528,"'s"], 556 | ['set',529,"'h"], 557 | ['set',530,"',"], 558 | ['set',531,"'H"], 559 | ['set',532,"'a"], 560 | ['set',533,"'w"], 561 | ['set',534,"'a"], 562 | ['set',535,"'i"], 563 | ['set',536,"'i"], 564 | ['set',537,"'a"], 565 | ['set',538,"'n"], 566 | ['set',539,"' "], 567 | ['set',540,"'S"], 568 | ['set',541,"'h"], 569 | ['set',542,"'i"], 570 | ['set',543,"'r"], 571 | ['set',544,"'t"], 572 | ['alloc',545,3], 573 | ['alloc',548,5], 574 | ['init',548,':<> '], 575 | ['set',549,'=3'], 576 | ['init',545,':[] '], 577 | ['set',546,'=0'], 578 | ['set',547,548], 579 | ['alloc',553,4], 580 | ['init',553,':s '], 581 | ['set',554,'=2'], 582 | ['copy',555,523,2], 583 | // push "-3" 584 | ['set',550,553], 585 | ['set',546,'=1'], 586 | ['alloc',557,6], 587 | ['init',557,':s '], 588 | ['set',558,'=4'], 589 | ['copy',559,526,4], 590 | // push "Wash" 591 | ['set',551,557], 592 | ['set',546,'=2'], 593 | ['alloc',563,16], 594 | ['init',563,':s '], 595 | ['set',564,'=14'], 596 | ['copy',565,531,14], 597 | // push "Hawaiian Shirt" 598 | ['set',552,563], 599 | ['set',546,'=3'], 600 | ['alloc',579,5], 601 | ['init',579,':<> '], 602 | ['set',580,'=3'], 603 | ['alloc',584,2], 604 | ['init',584,':n '], 605 | ['set',585,'=-3'], 606 | ['set',581,584], 607 | ['set',582,557], 608 | ['set',583,563], 609 | // push [-3,"Wash","Hawaiian Shirt"] 610 | ['set',472,579], 611 | ['set',2,'=7'], 612 | // line: -8,Jayne,Grenade Launcher 613 | ['alloc',586,27], 614 | ['init',586,':s '], 615 | ['set',587,'=25'], 616 | ['set',588,"'-"], 617 | ['set',589,"'8"], 618 | ['set',590,"',"], 619 | ['set',591,"'J"], 620 | ['set',592,"'a"], 621 | ['set',593,"'y"], 622 | ['set',594,"'n"], 623 | ['set',595,"'e"], 624 | ['set',596,"',"], 625 | ['set',597,"'G"], 626 | ['set',598,"'r"], 627 | ['set',599,"'e"], 628 | ['set',600,"'n"], 629 | ['set',601,"'a"], 630 | ['set',602,"'d"], 631 | ['set',603,"'e"], 632 | ['set',604,"' "], 633 | ['set',605,"'L"], 634 | ['set',606,"'a"], 635 | ['set',607,"'u"], 636 | ['set',608,"'n"], 637 | ['set',609,"'c"], 638 | ['set',610,"'h"], 639 | ['set',611,"'e"], 640 | ['set',612,"'r"], 641 | ['alloc',613,3], 642 | ['alloc',616,5], 643 | ['init',616,':<> '], 644 | ['set',617,'=3'], 645 | ['init',613,':[] '], 646 | ['set',614,'=0'], 647 | ['set',615,616], 648 | ['alloc',621,4], 649 | ['init',621,':s '], 650 | ['set',622,'=2'], 651 | ['copy',623,588,2], 652 | // push "-8" 653 | ['set',618,621], 654 | ['set',614,'=1'], 655 | ['alloc',625,7], 656 | ['init',625,':s '], 657 | ['set',626,'=5'], 658 | ['copy',627,591,5], 659 | // push "Jayne" 660 | ['set',619,625], 661 | ['set',614,'=2'], 662 | ['alloc',632,18], 663 | ['init',632,':s '], 664 | ['set',633,'=16'], 665 | ['copy',634,597,16], 666 | // push "Grenade Launcher" 667 | ['set',620,632], 668 | ['set',614,'=3'], 669 | ['alloc',650,5], 670 | ['init',650,':<> '], 671 | ['set',651,'=3'], 672 | ['alloc',655,2], 673 | ['init',655,':n '], 674 | ['set',656,'=-8'], 675 | ['set',652,655], 676 | ['set',653,625], 677 | ['set',654,632], 678 | // push [-8,"Jayne","Grenade Launcher"] 679 | ['set',473,650], 680 | ['set',2,'=8'], 681 | // line: -1,Kaylee,Wrench 682 | ['alloc',657,18], 683 | ['init',657,':s '], 684 | ['set',658,'=16'], 685 | ['set',659,"'-"], 686 | ['set',660,"'1"], 687 | ['set',661,"',"], 688 | ['set',662,"'K"], 689 | ['set',663,"'a"], 690 | ['set',664,"'y"], 691 | ['set',665,"'l"], 692 | ['set',666,"'e"], 693 | ['set',667,"'e"], 694 | ['set',668,"',"], 695 | ['set',669,"'W"], 696 | ['set',670,"'r"], 697 | ['set',671,"'e"], 698 | ['set',672,"'n"], 699 | ['set',673,"'c"], 700 | ['set',674,"'h"], 701 | ['alloc',675,3], 702 | ['alloc',678,5], 703 | ['init',678,':<> '], 704 | ['set',679,'=3'], 705 | ['init',675,':[] '], 706 | ['set',676,'=0'], 707 | ['set',677,678], 708 | ['alloc',683,4], 709 | ['init',683,':s '], 710 | ['set',684,'=2'], 711 | ['copy',685,659,2], 712 | // push "-1" 713 | ['set',680,683], 714 | ['set',676,'=1'], 715 | ['alloc',687,8], 716 | ['init',687,':s '], 717 | ['set',688,'=6'], 718 | ['copy',689,662,6], 719 | // push "Kaylee" 720 | ['set',681,687], 721 | ['set',676,'=2'], 722 | ['alloc',695,8], 723 | ['init',695,':s '], 724 | ['set',696,'=6'], 725 | ['copy',697,669,6], 726 | // push "Wrench" 727 | ['set',682,695], 728 | ['set',676,'=3'], 729 | ['alloc',703,5], 730 | ['init',703,':<> '], 731 | ['set',704,'=3'], 732 | ['alloc',708,2], 733 | ['init',708,':n '], 734 | ['set',709,'=-1'], 735 | ['set',705,708], 736 | ['set',706,687], 737 | ['set',707,695], 738 | // push [-1,"Kaylee","Wrench"] 739 | ['alloc',710,18], 740 | ['copy',710,464,10], 741 | ['init',710,':<> '], 742 | ['set',711,'=16'], 743 | ['set',3,710], 744 | ['set',720,703], 745 | ['set',2,'=9'], 746 | // line: 10,Zoe,Shando-Pan Monastery 747 | ['alloc',728,29], 748 | ['init',728,':s '], 749 | ['set',729,'=27'], 750 | ['set',730,"'1"], 751 | ['set',731,"'0"], 752 | ['set',732,"',"], 753 | ['set',733,"'Z"], 754 | ['set',734,"'o"], 755 | ['set',735,"'e"], 756 | ['set',736,"',"], 757 | ['set',737,"'S"], 758 | ['set',738,"'h"], 759 | ['set',739,"'a"], 760 | ['set',740,"'n"], 761 | ['set',741,"'d"], 762 | ['set',742,"'o"], 763 | ['set',743,"'-"], 764 | ['set',744,"'P"], 765 | ['set',745,"'a"], 766 | ['set',746,"'n"], 767 | ['set',747,"' "], 768 | ['set',748,"'M"], 769 | ['set',749,"'o"], 770 | ['set',750,"'n"], 771 | ['set',751,"'a"], 772 | ['set',752,"'s"], 773 | ['set',753,"'t"], 774 | ['set',754,"'e"], 775 | ['set',755,"'r"], 776 | ['set',756,"'y"], 777 | ['alloc',757,3], 778 | ['alloc',760,5], 779 | ['init',760,':<> '], 780 | ['set',761,'=3'], 781 | ['init',757,':[] '], 782 | ['set',758,'=0'], 783 | ['set',759,760], 784 | ['alloc',765,4], 785 | ['init',765,':s '], 786 | ['set',766,'=2'], 787 | ['copy',767,730,2], 788 | // push "10" 789 | ['set',762,765], 790 | ['set',758,'=1'], 791 | ['alloc',769,5], 792 | ['init',769,':s '], 793 | ['set',770,'=3'], 794 | ['copy',771,733,3], 795 | // push "Zoe" 796 | ['set',763,769], 797 | ['set',758,'=2'], 798 | ['alloc',774,22], 799 | ['init',774,':s '], 800 | ['set',775,'=20'], 801 | ['copy',776,737,20], 802 | // push "Shando-Pan Monastery" 803 | ['set',764,774], 804 | ['set',758,'=3'], 805 | ['alloc',796,5], 806 | ['init',796,':<> '], 807 | ['set',797,'=3'], 808 | ['alloc',801,2], 809 | ['init',801,':n '], 810 | ['set',802,'=10'], 811 | ['set',798,801], 812 | ['set',799,769], 813 | ['set',800,774], 814 | // push [10,"Zoe","Shando-Pan Monastery"] 815 | ['set',721,796], 816 | ['set',2,'=10'], 817 | ['ref_count',801,1], 818 | ['ref_count',796,1], 819 | ['ref_count',801,1], 820 | ['ref_count',769,1], 821 | ['ref_count',774,1], 822 | ['ref_count',757,1], 823 | ['ref_count',760,1], 824 | ['ref_count',765,1], 825 | ['ref_count',769,1], 826 | ['ref_count',774,1], 827 | ['ref_count',728,1], 828 | ['ref_count',1,1], 829 | ['ref_count',710,1], 830 | ['ref_count',87,1], 831 | ['ref_count',92,1], 832 | ['ref_count',54,1], 833 | ['ref_count',59,1], 834 | ['ref_count',176,1], 835 | ['ref_count',181,1], 836 | ['ref_count',142,1], 837 | ['ref_count',148,1], 838 | ['ref_count',267,1], 839 | ['ref_count',272,1], 840 | ['ref_count',234,1], 841 | ['ref_count',239,1], 842 | ['ref_count',364,1], 843 | ['ref_count',369,1], 844 | ['ref_count',329,1], 845 | ['ref_count',336,1], 846 | ['ref_count',457,1], 847 | ['ref_count',462,1], 848 | ['ref_count',421,1], 849 | ['ref_count',429,1], 850 | ['ref_count',514,1], 851 | ['ref_count',519,1], 852 | ['ref_count',501,1], 853 | ['ref_count',506,1], 854 | ['ref_count',579,1], 855 | ['ref_count',584,1], 856 | ['ref_count',557,1], 857 | ['ref_count',563,1], 858 | ['ref_count',650,1], 859 | ['ref_count',655,1], 860 | ['ref_count',625,1], 861 | ['ref_count',632,1], 862 | ['ref_count',703,1], 863 | ['ref_count',708,1], 864 | ['ref_count',687,1], 865 | ['ref_count',695,1], 866 | ['ref_count',796,1], 867 | ['ref_count',801,1], 868 | ['ref_count',769,1], 869 | ['ref_count',774,1], 870 | ['init',4,':- '], 871 | ['free',4,3], 872 | ['init',7,':- '], 873 | ['free',7,35], 874 | ['init',42,':- '], 875 | ['free',42,3], 876 | ['init',45,':- '], 877 | ['free',45,5], 878 | ['init',50,':- '], 879 | ['free',50,4], 880 | ['init',94,':- '], 881 | ['free',94,36], 882 | ['init',130,':- '], 883 | ['free',130,3], 884 | ['init',133,':- '], 885 | ['free',133,5], 886 | ['init',138,':- '], 887 | ['free',138,4], 888 | ['init',183,':- '], 889 | ['free',183,4], 890 | ['init',187,':- '], 891 | ['free',187,35], 892 | ['init',222,':- '], 893 | ['free',222,3], 894 | ['init',225,':- '], 895 | ['free',225,5], 896 | ['init',230,':- '], 897 | ['free',230,4], 898 | ['init',274,':- '], 899 | ['free',274,6], 900 | ['init',280,':- '], 901 | ['free',280,37], 902 | ['init',317,':- '], 903 | ['free',317,3], 904 | ['init',320,':- '], 905 | ['free',320,5], 906 | ['init',325,':- '], 907 | ['free',325,4], 908 | ['init',371,':- '], 909 | ['free',371,38], 910 | ['init',409,':- '], 911 | ['free',409,3], 912 | ['init',412,':- '], 913 | ['free',412,5], 914 | ['init',417,':- '], 915 | ['free',417,4], 916 | ['init',464,':- '], 917 | ['free',464,10], 918 | ['init',474,':- '], 919 | ['free',474,15], 920 | ['init',489,':- '], 921 | ['free',489,3], 922 | ['init',492,':- '], 923 | ['free',492,5], 924 | ['init',497,':- '], 925 | ['free',497,4], 926 | ['init',521,':- '], 927 | ['free',521,24], 928 | ['init',545,':- '], 929 | ['free',545,3], 930 | ['init',548,':- '], 931 | ['free',548,5], 932 | ['init',553,':- '], 933 | ['free',553,4], 934 | ['init',586,':- '], 935 | ['free',586,27], 936 | ['init',613,':- '], 937 | ['free',613,3], 938 | ['init',616,':- '], 939 | ['free',616,5], 940 | ['init',621,':- '], 941 | ['free',621,4], 942 | ['init',657,':- '], 943 | ['free',657,18], 944 | ['init',675,':- '], 945 | ['free',675,3], 946 | ['init',678,':- '], 947 | ['free',678,5], 948 | ['init',683,':- '], 949 | ['free',683,4], 950 | // line: 10,Wash,Shando-Pan Monastery 951 | ['alloc',803,30], 952 | ['init',803,':s '], 953 | ['set',804,'=28'], 954 | ['set',805,"'1"], 955 | ['set',806,"'0"], 956 | ['set',807,"',"], 957 | ['set',808,"'W"], 958 | ['set',809,"'a"], 959 | ['set',810,"'s"], 960 | ['set',811,"'h"], 961 | ['set',812,"',"], 962 | ['set',813,"'S"], 963 | ['set',814,"'h"], 964 | ['set',815,"'a"], 965 | ['set',816,"'n"], 966 | ['set',817,"'d"], 967 | ['set',818,"'o"], 968 | ['set',819,"'-"], 969 | ['set',820,"'P"], 970 | ['set',821,"'a"], 971 | ['set',822,"'n"], 972 | ['set',823,"' "], 973 | ['set',824,"'M"], 974 | ['set',825,"'o"], 975 | ['set',826,"'n"], 976 | ['set',827,"'a"], 977 | ['set',828,"'s"], 978 | ['set',829,"'t"], 979 | ['set',830,"'e"], 980 | ['set',831,"'r"], 981 | ['set',832,"'y"], 982 | ['alloc',833,3], 983 | ['alloc',836,5], 984 | ['init',836,':<> '], 985 | ['set',837,'=3'], 986 | ['init',833,':[] '], 987 | ['set',834,'=0'], 988 | ['set',835,836], 989 | ['alloc',841,4], 990 | ['init',841,':s '], 991 | ['set',842,'=2'], 992 | ['copy',843,805,2], 993 | // push "10" 994 | ['set',838,841], 995 | ['set',834,'=1'], 996 | ['alloc',845,6], 997 | ['init',845,':s '], 998 | ['set',846,'=4'], 999 | ['copy',847,808,4], 1000 | // push "Wash" 1001 | ['set',839,845], 1002 | ['set',834,'=2'], 1003 | ['alloc',851,22], 1004 | ['init',851,':s '], 1005 | ['set',852,'=20'], 1006 | ['copy',853,813,20], 1007 | // push "Shando-Pan Monastery" 1008 | ['set',840,851], 1009 | ['set',834,'=3'], 1010 | ['alloc',873,5], 1011 | ['init',873,':<> '], 1012 | ['set',874,'=3'], 1013 | ['alloc',878,2], 1014 | ['init',878,':n '], 1015 | ['set',879,'=10'], 1016 | ['set',875,878], 1017 | ['set',876,845], 1018 | ['set',877,851], 1019 | // push [10,"Wash","Shando-Pan Monastery"] 1020 | ['set',722,873], 1021 | ['set',2,'=11'], 1022 | // line: 10,Mal,Shando-Pan Monastery 1023 | ['alloc',880,29], 1024 | ['init',880,':s '], 1025 | ['set',881,'=27'], 1026 | ['set',882,"'1"], 1027 | ['set',883,"'0"], 1028 | ['set',884,"',"], 1029 | ['set',885,"'M"], 1030 | ['set',886,"'a"], 1031 | ['set',887,"'l"], 1032 | ['set',888,"',"], 1033 | ['set',889,"'S"], 1034 | ['set',890,"'h"], 1035 | ['set',891,"'a"], 1036 | ['set',892,"'n"], 1037 | ['set',893,"'d"], 1038 | ['set',894,"'o"], 1039 | ['set',895,"'-"], 1040 | ['set',896,"'P"], 1041 | ['set',897,"'a"], 1042 | ['set',898,"'n"], 1043 | ['set',899,"' "], 1044 | ['set',900,"'M"], 1045 | ['set',901,"'o"], 1046 | ['set',902,"'n"], 1047 | ['set',903,"'a"], 1048 | ['set',904,"'s"], 1049 | ['set',905,"'t"], 1050 | ['set',906,"'e"], 1051 | ['set',907,"'r"], 1052 | ['set',908,"'y"], 1053 | ['alloc',909,3], 1054 | ['alloc',912,5], 1055 | ['init',912,':<> '], 1056 | ['set',913,'=3'], 1057 | ['init',909,':[] '], 1058 | ['set',910,'=0'], 1059 | ['set',911,912], 1060 | ['alloc',917,4], 1061 | ['init',917,':s '], 1062 | ['set',918,'=2'], 1063 | ['copy',919,882,2], 1064 | // push "10" 1065 | ['set',914,917], 1066 | ['set',910,'=1'], 1067 | ['alloc',921,5], 1068 | ['init',921,':s '], 1069 | ['set',922,'=3'], 1070 | ['copy',923,885,3], 1071 | // push "Mal" 1072 | ['set',915,921], 1073 | ['set',910,'=2'], 1074 | ['alloc',926,22], 1075 | ['init',926,':s '], 1076 | ['set',927,'=20'], 1077 | ['copy',928,889,20], 1078 | // push "Shando-Pan Monastery" 1079 | ['set',916,926], 1080 | ['set',910,'=3'], 1081 | ['alloc',948,5], 1082 | ['init',948,':<> '], 1083 | ['set',949,'=3'], 1084 | ['alloc',953,2], 1085 | ['init',953,':n '], 1086 | ['set',954,'=10'], 1087 | ['set',950,953], 1088 | ['set',951,921], 1089 | ['set',952,926], 1090 | // push [10,"Mal","Shando-Pan Monastery"] 1091 | ['set',723,948], 1092 | ['set',2,'=12'], 1093 | // line: 10,Jayne,Shando-Pan Monastery 1094 | ['alloc',955,31], 1095 | ['init',955,':s '], 1096 | ['set',956,'=29'], 1097 | ['set',957,"'1"], 1098 | ['set',958,"'0"], 1099 | ['set',959,"',"], 1100 | ['set',960,"'J"], 1101 | ['set',961,"'a"], 1102 | ['set',962,"'y"], 1103 | ['set',963,"'n"], 1104 | ['set',964,"'e"], 1105 | ['set',965,"',"], 1106 | ['set',966,"'S"], 1107 | ['set',967,"'h"], 1108 | ['set',968,"'a"], 1109 | ['set',969,"'n"], 1110 | ['set',970,"'d"], 1111 | ['set',971,"'o"], 1112 | ['set',972,"'-"], 1113 | ['set',973,"'P"], 1114 | ['set',974,"'a"], 1115 | ['set',975,"'n"], 1116 | ['set',976,"' "], 1117 | ['set',977,"'M"], 1118 | ['set',978,"'o"], 1119 | ['set',979,"'n"], 1120 | ['set',980,"'a"], 1121 | ['set',981,"'s"], 1122 | ['set',982,"'t"], 1123 | ['set',983,"'e"], 1124 | ['set',984,"'r"], 1125 | ['set',985,"'y"], 1126 | ['alloc',986,3], 1127 | ['alloc',989,5], 1128 | ['init',989,':<> '], 1129 | ['set',990,'=3'], 1130 | ['init',986,':[] '], 1131 | ['set',987,'=0'], 1132 | ['set',988,989], 1133 | ['alloc',994,4], 1134 | ['init',994,':s '], 1135 | ['set',995,'=2'], 1136 | ['copy',996,957,2], 1137 | // push "10" 1138 | ['set',991,994], 1139 | ['set',987,'=1'], 1140 | ['alloc',998,7], 1141 | ['init',998,':s '], 1142 | ['set',999,'=5'], 1143 | ['copy',1000,960,5], 1144 | // push "Jayne" 1145 | ['set',992,998], 1146 | ['set',987,'=2'], 1147 | ['alloc',1005,22], 1148 | ['init',1005,':s '], 1149 | ['set',1006,'=20'], 1150 | ['copy',1007,966,20], 1151 | // push "Shando-Pan Monastery" 1152 | ['set',993,1005], 1153 | ['set',987,'=3'], 1154 | ['alloc',1027,5], 1155 | ['init',1027,':<> '], 1156 | ['set',1028,'=3'], 1157 | ['alloc',1032,2], 1158 | ['init',1032,':n '], 1159 | ['set',1033,'=10'], 1160 | ['set',1029,1032], 1161 | ['set',1030,998], 1162 | ['set',1031,1005], 1163 | // push [10,"Jayne","Shando-Pan Monastery"] 1164 | ['set',724,1027], 1165 | ['set',2,'=13'], 1166 | // line: 10,Shepherd,Shando-Pan Monastery 1167 | ['alloc',1034,34], 1168 | ['init',1034,':s '], 1169 | ['set',1035,'=32'], 1170 | ['set',1036,"'1"], 1171 | ['set',1037,"'0"], 1172 | ['set',1038,"',"], 1173 | ['set',1039,"'S"], 1174 | ['set',1040,"'h"], 1175 | ['set',1041,"'e"], 1176 | ['set',1042,"'p"], 1177 | ['set',1043,"'h"], 1178 | ['set',1044,"'e"], 1179 | ['set',1045,"'r"], 1180 | ['set',1046,"'d"], 1181 | ['set',1047,"',"], 1182 | ['set',1048,"'S"], 1183 | ['set',1049,"'h"], 1184 | ['set',1050,"'a"], 1185 | ['set',1051,"'n"], 1186 | ['set',1052,"'d"], 1187 | ['set',1053,"'o"], 1188 | ['set',1054,"'-"], 1189 | ['set',1055,"'P"], 1190 | ['set',1056,"'a"], 1191 | ['set',1057,"'n"], 1192 | ['set',1058,"' "], 1193 | ['set',1059,"'M"], 1194 | ['set',1060,"'o"], 1195 | ['set',1061,"'n"], 1196 | ['set',1062,"'a"], 1197 | ['set',1063,"'s"], 1198 | ['set',1064,"'t"], 1199 | ['set',1065,"'e"], 1200 | ['set',1066,"'r"], 1201 | ['set',1067,"'y"], 1202 | ['alloc',1068,3], 1203 | ['alloc',1071,5], 1204 | ['init',1071,':<> '], 1205 | ['set',1072,'=3'], 1206 | ['init',1068,':[] '], 1207 | ['set',1069,'=0'], 1208 | ['set',1070,1071], 1209 | ['alloc',1076,4], 1210 | ['init',1076,':s '], 1211 | ['set',1077,'=2'], 1212 | ['copy',1078,1036,2], 1213 | // push "10" 1214 | ['set',1073,1076], 1215 | ['set',1069,'=1'], 1216 | ['alloc',1080,10], 1217 | ['init',1080,':s '], 1218 | ['set',1081,'=8'], 1219 | ['copy',1082,1039,8], 1220 | // push "Shepherd" 1221 | ['set',1074,1080], 1222 | ['set',1069,'=2'], 1223 | ['alloc',1090,22], 1224 | ['init',1090,':s '], 1225 | ['set',1091,'=20'], 1226 | ['copy',1092,1048,20], 1227 | // push "Shando-Pan Monastery" 1228 | ['set',1075,1090], 1229 | ['set',1069,'=3'], 1230 | ['alloc',1112,5], 1231 | ['init',1112,':<> '], 1232 | ['set',1113,'=3'], 1233 | ['alloc',1117,2], 1234 | ['init',1117,':n '], 1235 | ['set',1118,'=10'], 1236 | ['set',1114,1117], 1237 | ['set',1115,1080], 1238 | ['set',1116,1090], 1239 | // push [10,"Shepherd","Shando-Pan Monastery"] 1240 | ['set',725,1112], 1241 | ['set',2,'=14'], 1242 | // line: -2,Wash,Cargo Shorts 1243 | ['alloc',1119,22], 1244 | ['init',1119,':s '], 1245 | ['set',1120,'=20'], 1246 | ['set',1121,"'-"], 1247 | ['set',1122,"'2"], 1248 | ['set',1123,"',"], 1249 | ['set',1124,"'W"], 1250 | ['set',1125,"'a"], 1251 | ['set',1126,"'s"], 1252 | ['set',1127,"'h"], 1253 | ['set',1128,"',"], 1254 | ['set',1129,"'C"], 1255 | ['set',1130,"'a"], 1256 | ['set',1131,"'r"], 1257 | ['set',1132,"'g"], 1258 | ['set',1133,"'o"], 1259 | ['set',1134,"' "], 1260 | ['set',1135,"'S"], 1261 | ['set',1136,"'h"], 1262 | ['set',1137,"'o"], 1263 | ['set',1138,"'r"], 1264 | ['set',1139,"'t"], 1265 | ['set',1140,"'s"], 1266 | ['alloc',1141,3], 1267 | ['alloc',1144,5], 1268 | ['init',1144,':<> '], 1269 | ['set',1145,'=3'], 1270 | ['init',1141,':[] '], 1271 | ['set',1142,'=0'], 1272 | ['set',1143,1144], 1273 | ['alloc',1149,4], 1274 | ['init',1149,':s '], 1275 | ['set',1150,'=2'], 1276 | ['copy',1151,1121,2], 1277 | // push "-2" 1278 | ['set',1146,1149], 1279 | ['set',1142,'=1'], 1280 | ['alloc',1153,6], 1281 | ['init',1153,':s '], 1282 | ['set',1154,'=4'], 1283 | ['copy',1155,1124,4], 1284 | // push "Wash" 1285 | ['set',1147,1153], 1286 | ['set',1142,'=2'], 1287 | ['alloc',1159,14], 1288 | ['init',1159,':s '], 1289 | ['set',1160,'=12'], 1290 | ['copy',1161,1129,12], 1291 | // push "Cargo Shorts" 1292 | ['set',1148,1159], 1293 | ['set',1142,'=3'], 1294 | ['alloc',1173,5], 1295 | ['init',1173,':<> '], 1296 | ['set',1174,'=3'], 1297 | ['alloc',1178,2], 1298 | ['init',1178,':n '], 1299 | ['set',1179,'=-2'], 1300 | ['set',1175,1178], 1301 | ['set',1176,1153], 1302 | ['set',1177,1159], 1303 | // push [-2,"Wash","Cargo Shorts"] 1304 | ['set',726,1173], 1305 | ['set',2,'=15'], 1306 | ['ref_count',1178,1], 1307 | ['ref_count',1173,1], 1308 | ['ref_count',1178,1], 1309 | ['ref_count',1153,1], 1310 | ['ref_count',1159,1], 1311 | ['ref_count',1141,1], 1312 | ['ref_count',1144,1], 1313 | ['ref_count',1149,1], 1314 | ['ref_count',1153,1], 1315 | ['ref_count',1159,1], 1316 | ['ref_count',1119,1], 1317 | ['ref_count',1,1], 1318 | ['ref_count',710,1], 1319 | ['ref_count',87,1], 1320 | ['ref_count',92,1], 1321 | ['ref_count',54,1], 1322 | ['ref_count',59,1], 1323 | ['ref_count',176,1], 1324 | ['ref_count',181,1], 1325 | ['ref_count',142,1], 1326 | ['ref_count',148,1], 1327 | ['ref_count',267,1], 1328 | ['ref_count',272,1], 1329 | ['ref_count',234,1], 1330 | ['ref_count',239,1], 1331 | ['ref_count',364,1], 1332 | ['ref_count',369,1], 1333 | ['ref_count',329,1], 1334 | ['ref_count',336,1], 1335 | ['ref_count',457,1], 1336 | ['ref_count',462,1], 1337 | ['ref_count',421,1], 1338 | ['ref_count',429,1], 1339 | ['ref_count',514,1], 1340 | ['ref_count',519,1], 1341 | ['ref_count',501,1], 1342 | ['ref_count',506,1], 1343 | ['ref_count',579,1], 1344 | ['ref_count',584,1], 1345 | ['ref_count',557,1], 1346 | ['ref_count',563,1], 1347 | ['ref_count',650,1], 1348 | ['ref_count',655,1], 1349 | ['ref_count',625,1], 1350 | ['ref_count',632,1], 1351 | ['ref_count',703,1], 1352 | ['ref_count',708,1], 1353 | ['ref_count',687,1], 1354 | ['ref_count',695,1], 1355 | ['ref_count',796,1], 1356 | ['ref_count',801,1], 1357 | ['ref_count',769,1], 1358 | ['ref_count',774,1], 1359 | ['ref_count',873,1], 1360 | ['ref_count',878,1], 1361 | ['ref_count',845,1], 1362 | ['ref_count',851,1], 1363 | ['ref_count',948,1], 1364 | ['ref_count',953,1], 1365 | ['ref_count',921,1], 1366 | ['ref_count',926,1], 1367 | ['ref_count',1027,1], 1368 | ['ref_count',1032,1], 1369 | ['ref_count',998,1], 1370 | ['ref_count',1005,1], 1371 | ['ref_count',1112,1], 1372 | ['ref_count',1117,1], 1373 | ['ref_count',1080,1], 1374 | ['ref_count',1090,1], 1375 | ['ref_count',1173,1], 1376 | ['ref_count',1178,1], 1377 | ['ref_count',1153,1], 1378 | ['ref_count',1159,1], 1379 | ['init',4,':- '], 1380 | ['free',4,3], 1381 | ['init',7,':- '], 1382 | ['free',7,35], 1383 | ['init',42,':- '], 1384 | ['free',42,3], 1385 | ['init',45,':- '], 1386 | ['free',45,5], 1387 | ['init',50,':- '], 1388 | ['free',50,4], 1389 | ['init',94,':- '], 1390 | ['free',94,36], 1391 | ['init',130,':- '], 1392 | ['free',130,3], 1393 | ['init',133,':- '], 1394 | ['free',133,5], 1395 | ['init',138,':- '], 1396 | ['free',138,4], 1397 | ['init',183,':- '], 1398 | ['free',183,4], 1399 | ['init',187,':- '], 1400 | ['free',187,35], 1401 | ['init',222,':- '], 1402 | ['free',222,3], 1403 | ['init',225,':- '], 1404 | ['free',225,5], 1405 | ['init',230,':- '], 1406 | ['free',230,4], 1407 | ['init',274,':- '], 1408 | ['free',274,6], 1409 | ['init',280,':- '], 1410 | ['free',280,37], 1411 | ['init',317,':- '], 1412 | ['free',317,3], 1413 | ['init',320,':- '], 1414 | ['free',320,5], 1415 | ['init',325,':- '], 1416 | ['free',325,4], 1417 | ['init',371,':- '], 1418 | ['free',371,38], 1419 | ['init',409,':- '], 1420 | ['free',409,3], 1421 | ['init',412,':- '], 1422 | ['free',412,5], 1423 | ['init',417,':- '], 1424 | ['free',417,4], 1425 | ['init',464,':- '], 1426 | ['free',464,10], 1427 | ['init',474,':- '], 1428 | ['free',474,15], 1429 | ['init',489,':- '], 1430 | ['free',489,3], 1431 | ['init',492,':- '], 1432 | ['free',492,5], 1433 | ['init',497,':- '], 1434 | ['free',497,4], 1435 | ['init',521,':- '], 1436 | ['free',521,24], 1437 | ['init',545,':- '], 1438 | ['free',545,3], 1439 | ['init',548,':- '], 1440 | ['free',548,5], 1441 | ['init',553,':- '], 1442 | ['free',553,4], 1443 | ['init',586,':- '], 1444 | ['free',586,27], 1445 | ['init',613,':- '], 1446 | ['free',613,3], 1447 | ['init',616,':- '], 1448 | ['free',616,5], 1449 | ['init',621,':- '], 1450 | ['free',621,4], 1451 | ['init',657,':- '], 1452 | ['free',657,18], 1453 | ['init',675,':- '], 1454 | ['free',675,3], 1455 | ['init',678,':- '], 1456 | ['free',678,5], 1457 | ['init',683,':- '], 1458 | ['free',683,4], 1459 | ['init',728,':- '], 1460 | ['free',728,29], 1461 | ['init',757,':- '], 1462 | ['free',757,3], 1463 | ['init',760,':- '], 1464 | ['free',760,5], 1465 | ['init',765,':- '], 1466 | ['free',765,4], 1467 | ['init',803,':- '], 1468 | ['free',803,30], 1469 | ['init',833,':- '], 1470 | ['free',833,3], 1471 | ['init',836,':- '], 1472 | ['free',836,5], 1473 | ['init',841,':- '], 1474 | ['free',841,4], 1475 | ['init',880,':- '], 1476 | ['free',880,29], 1477 | ['init',909,':- '], 1478 | ['free',909,3], 1479 | ['init',912,':- '], 1480 | ['free',912,5], 1481 | ['init',917,':- '], 1482 | ['free',917,4], 1483 | ['init',955,':- '], 1484 | ['free',955,31], 1485 | ['init',986,':- '], 1486 | ['free',986,3], 1487 | ['init',989,':- '], 1488 | ['free',989,5], 1489 | ['init',994,':- '], 1490 | ['free',994,4], 1491 | ['init',1034,':- '], 1492 | ['free',1034,34], 1493 | ['init',1068,':- '], 1494 | ['free',1068,3], 1495 | ['init',1071,':- '], 1496 | ['free',1071,5], 1497 | ['init',1076,':- '], 1498 | ['free',1076,4], 1499 | ['bp','file parsed'], 1500 | ['roots',1,0], 1501 | ['live',0,1,54,59,87,92,142,148,176,181,234,239,267,272,329,336,364,369,421,429,457,462,501,506,514,519,557,563,579,584,625,632,650,655,687,695,703,708,710,769,774,796,801,845,851,873,878,921,926,948,953,998,1005,1027,1032,1080,1090,1112,1117,1153,1159,1173,1178], 1502 | // [[10,"Mal","Temple of the Jade Serpent"],[10,"Wash","Temple of the Jade Serpent"],[10,"Zoe","Temple of the Jade Serpent"],[10,"Jayne","Temple of the Jade Serpent"],[10,"Kaylee","Temple of the Jade Serpent"],[-3,"Mal","Pistol"],[-3,"Wash","Hawaiian Shirt"],[-8,"Jayne","Grenade Launcher"],[-1,"Kaylee","Wrench"],[10,"Zoe","Shando-Pan Monastery"],[10,"Wash","Shando-Pan Monastery"],[10,"Mal","Shando-Pan Monastery"],[10,"Jayne","Shando-Pan Monastery"],[10,"Shepherd","Shando-Pan Monastery"],[-2,"Wash","Cargo Shorts"]] 1503 | ['alloc',1180,3], 1504 | ['alloc',1183,3], 1505 | ['init',1183,':<> '], 1506 | ['set',1184,'=1'], 1507 | ['init',1180,':[] '], 1508 | ['set',1181,'=0'], 1509 | ['set',1182,1183], 1510 | ['alloc',1186,4], 1511 | ['init',1186,':<> '], 1512 | ['set',1187,'=2'], 1513 | ['set',1188,54], 1514 | ['alloc',1190,3], 1515 | ['alloc',1193,3], 1516 | ['init',1193,':<> '], 1517 | ['set',1194,'=1'], 1518 | ['init',1190,':[] '], 1519 | ['set',1191,'=0'], 1520 | ['set',1192,1193], 1521 | ['set',1189,1190], 1522 | // push ["Mal",[]] 1523 | ['set',1185,1186], 1524 | ['set',1181,'=1'], 1525 | // push [10,"Mal","Temple of the Jade Serpent"] 1526 | ['set',1195,87], 1527 | ['set',1191,'=1'], 1528 | // push [-3,"Mal","Pistol"] 1529 | ['alloc',1196,4], 1530 | ['copy',1196,1193,3], 1531 | ['init',1196,':<> '], 1532 | ['set',1197,'=2'], 1533 | ['set',1192,1196], 1534 | ['set',1199,514], 1535 | ['set',1191,'=2'], 1536 | // push [10,"Mal","Shando-Pan Monastery"] 1537 | ['alloc',1200,6], 1538 | ['copy',1200,1196,4], 1539 | ['init',1200,':<> '], 1540 | ['set',1201,'=4'], 1541 | ['set',1192,1200], 1542 | ['set',1204,948], 1543 | ['set',1191,'=3'], 1544 | ['alloc',1206,4], 1545 | ['init',1206,':<> '], 1546 | ['set',1207,'=2'], 1547 | ['set',1208,142], 1548 | ['alloc',1210,3], 1549 | ['alloc',1213,3], 1550 | ['init',1213,':<> '], 1551 | ['set',1214,'=1'], 1552 | ['init',1210,':[] '], 1553 | ['set',1211,'=0'], 1554 | ['set',1212,1213], 1555 | ['set',1209,1210], 1556 | // push ["Wash",[]] 1557 | ['alloc',1216,4], 1558 | ['copy',1216,1183,3], 1559 | ['init',1216,':<> '], 1560 | ['set',1217,'=2'], 1561 | ['set',1182,1216], 1562 | ['set',1219,1206], 1563 | ['set',1181,'=2'], 1564 | // push [10,"Wash","Temple of the Jade Serpent"] 1565 | ['set',1215,176], 1566 | ['set',1211,'=1'], 1567 | // push [-3,"Wash","Hawaiian Shirt"] 1568 | ['alloc',1220,4], 1569 | ['copy',1220,1213,3], 1570 | ['init',1220,':<> '], 1571 | ['set',1221,'=2'], 1572 | ['set',1212,1220], 1573 | ['set',1223,579], 1574 | ['set',1211,'=2'], 1575 | // push [10,"Wash","Shando-Pan Monastery"] 1576 | ['alloc',1224,6], 1577 | ['copy',1224,1220,4], 1578 | ['init',1224,':<> '], 1579 | ['set',1225,'=4'], 1580 | ['set',1212,1224], 1581 | ['set',1228,873], 1582 | ['set',1211,'=3'], 1583 | // push [-2,"Wash","Cargo Shorts"] 1584 | ['set',1229,1173], 1585 | ['set',1211,'=4'], 1586 | ['bp','group found'], 1587 | ['roots',1210,1206,1180,1,0], 1588 | ['live',0,1,54,59,87,92,142,148,176,181,234,239,267,272,329,336,364,369,421,429,457,462,501,506,514,519,557,563,579,584,625,632,650,655,687,695,703,708,710,769,774,796,801,845,851,873,878,921,926,948,953,998,1005,1027,1032,1080,1090,1112,1117,1153,1159,1173,1178,1180,1186,1190,1200,1206,1210,1216,1224], 1589 | ['alloc',1230,4], 1590 | ['init',1230,':<> '], 1591 | ['set',1231,'=2'], 1592 | ['set',1232,234], 1593 | ['alloc',1234,3], 1594 | ['alloc',1237,3], 1595 | ['init',1237,':<> '], 1596 | ['set',1238,'=1'], 1597 | ['init',1234,':[] '], 1598 | ['set',1235,'=0'], 1599 | ['set',1236,1237], 1600 | ['set',1233,1234], 1601 | // push ["Zoe",[]] 1602 | ['alloc',1240,6], 1603 | ['copy',1240,1216,4], 1604 | ['init',1240,':<> '], 1605 | ['set',1241,'=4'], 1606 | ['set',1182,1240], 1607 | ['set',1244,1230], 1608 | ['set',1181,'=3'], 1609 | // push [10,"Zoe","Temple of the Jade Serpent"] 1610 | ['set',1239,267], 1611 | ['set',1235,'=1'], 1612 | // push [10,"Zoe","Shando-Pan Monastery"] 1613 | ['alloc',1246,4], 1614 | ['copy',1246,1237,3], 1615 | ['init',1246,':<> '], 1616 | ['set',1247,'=2'], 1617 | ['set',1236,1246], 1618 | ['set',1249,796], 1619 | ['set',1235,'=2'], 1620 | ['alloc',1250,4], 1621 | ['init',1250,':<> '], 1622 | ['set',1251,'=2'], 1623 | ['set',1252,329], 1624 | ['alloc',1254,3], 1625 | ['alloc',1257,3], 1626 | ['init',1257,':<> '], 1627 | ['set',1258,'=1'], 1628 | ['init',1254,':[] '], 1629 | ['set',1255,'=0'], 1630 | ['set',1256,1257], 1631 | ['set',1253,1254], 1632 | // push ["Jayne",[]] 1633 | ['set',1245,1250], 1634 | ['set',1181,'=4'], 1635 | // push [10,"Jayne","Temple of the Jade Serpent"] 1636 | ['set',1259,364], 1637 | ['set',1255,'=1'], 1638 | // push [-8,"Jayne","Grenade Launcher"] 1639 | ['alloc',1260,4], 1640 | ['copy',1260,1257,3], 1641 | ['init',1260,':<> '], 1642 | ['set',1261,'=2'], 1643 | ['set',1256,1260], 1644 | ['set',1263,650], 1645 | ['set',1255,'=2'], 1646 | // push [10,"Jayne","Shando-Pan Monastery"] 1647 | ['alloc',1264,6], 1648 | ['copy',1264,1260,4], 1649 | ['init',1264,':<> '], 1650 | ['set',1265,'=4'], 1651 | ['set',1256,1264], 1652 | ['set',1268,1027], 1653 | ['set',1255,'=3'], 1654 | ['alloc',1270,4], 1655 | ['init',1270,':<> '], 1656 | ['set',1271,'=2'], 1657 | ['set',1272,421], 1658 | ['alloc',1274,3], 1659 | ['alloc',1277,3], 1660 | ['init',1277,':<> '], 1661 | ['set',1278,'=1'], 1662 | ['init',1274,':[] '], 1663 | ['set',1275,'=0'], 1664 | ['set',1276,1277], 1665 | ['set',1273,1274], 1666 | // push ["Kaylee",[]] 1667 | ['alloc',1280,10], 1668 | ['copy',1280,1240,6], 1669 | ['init',1280,':<> '], 1670 | ['set',1281,'=8'], 1671 | ['set',1182,1280], 1672 | ['set',1286,1270], 1673 | ['set',1181,'=5'], 1674 | // push [10,"Kaylee","Temple of the Jade Serpent"] 1675 | ['set',1279,457], 1676 | ['set',1275,'=1'], 1677 | // push [-1,"Kaylee","Wrench"] 1678 | ['alloc',1290,4], 1679 | ['copy',1290,1277,3], 1680 | ['init',1290,':<> '], 1681 | ['set',1291,'=2'], 1682 | ['set',1276,1290], 1683 | ['set',1293,703], 1684 | ['set',1275,'=2'], 1685 | ['alloc',1294,4], 1686 | ['init',1294,':<> '], 1687 | ['set',1295,'=2'], 1688 | ['set',1296,1080], 1689 | ['alloc',1298,3], 1690 | ['alloc',1301,3], 1691 | ['init',1301,':<> '], 1692 | ['set',1302,'=1'], 1693 | ['init',1298,':[] '], 1694 | ['set',1299,'=0'], 1695 | ['set',1300,1301], 1696 | ['set',1297,1298], 1697 | // push ["Shepherd",[]] 1698 | ['set',1287,1294], 1699 | ['set',1181,'=6'], 1700 | // push [10,"Shepherd","Shando-Pan Monastery"] 1701 | ['set',1303,1112], 1702 | ['set',1299,'=1'], 1703 | ['ref_count',1180,1], 1704 | ['ref_count',1280,1], 1705 | ['ref_count',1186,1], 1706 | ['ref_count',54,1], 1707 | ['ref_count',1190,1], 1708 | ['ref_count',1200,1], 1709 | ['ref_count',87,1], 1710 | ['ref_count',92,1], 1711 | ['ref_count',54,1], 1712 | ['ref_count',59,1], 1713 | ['ref_count',514,1], 1714 | ['ref_count',519,1], 1715 | ['ref_count',501,1], 1716 | ['ref_count',506,1], 1717 | ['ref_count',948,1], 1718 | ['ref_count',953,1], 1719 | ['ref_count',921,1], 1720 | ['ref_count',926,1], 1721 | ['ref_count',1206,1], 1722 | ['ref_count',142,1], 1723 | ['ref_count',1210,1], 1724 | ['ref_count',1224,1], 1725 | ['ref_count',176,1], 1726 | ['ref_count',181,1], 1727 | ['ref_count',142,1], 1728 | ['ref_count',148,1], 1729 | ['ref_count',579,1], 1730 | ['ref_count',584,1], 1731 | ['ref_count',557,1], 1732 | ['ref_count',563,1], 1733 | ['ref_count',873,1], 1734 | ['ref_count',878,1], 1735 | ['ref_count',845,1], 1736 | ['ref_count',851,1], 1737 | ['ref_count',1173,1], 1738 | ['ref_count',1178,1], 1739 | ['ref_count',1153,1], 1740 | ['ref_count',1159,1], 1741 | ['ref_count',1230,1], 1742 | ['ref_count',234,1], 1743 | ['ref_count',1234,1], 1744 | ['ref_count',1246,1], 1745 | ['ref_count',267,1], 1746 | ['ref_count',272,1], 1747 | ['ref_count',234,1], 1748 | ['ref_count',239,1], 1749 | ['ref_count',796,1], 1750 | ['ref_count',801,1], 1751 | ['ref_count',769,1], 1752 | ['ref_count',774,1], 1753 | ['ref_count',1250,1], 1754 | ['ref_count',329,1], 1755 | ['ref_count',1254,1], 1756 | ['ref_count',1264,1], 1757 | ['ref_count',364,1], 1758 | ['ref_count',369,1], 1759 | ['ref_count',329,1], 1760 | ['ref_count',336,1], 1761 | ['ref_count',650,1], 1762 | ['ref_count',655,1], 1763 | ['ref_count',625,1], 1764 | ['ref_count',632,1], 1765 | ['ref_count',1027,1], 1766 | ['ref_count',1032,1], 1767 | ['ref_count',998,1], 1768 | ['ref_count',1005,1], 1769 | ['ref_count',1270,1], 1770 | ['ref_count',421,1], 1771 | ['ref_count',1274,1], 1772 | ['ref_count',1290,1], 1773 | ['ref_count',457,1], 1774 | ['ref_count',462,1], 1775 | ['ref_count',421,1], 1776 | ['ref_count',429,1], 1777 | ['ref_count',703,1], 1778 | ['ref_count',708,1], 1779 | ['ref_count',687,1], 1780 | ['ref_count',695,1], 1781 | ['ref_count',1294,1], 1782 | ['ref_count',1080,1], 1783 | ['ref_count',1298,1], 1784 | ['ref_count',1301,1], 1785 | ['ref_count',1112,1], 1786 | ['ref_count',1117,1], 1787 | ['ref_count',1080,1], 1788 | ['ref_count',1090,1], 1789 | ['init',1,':- '], 1790 | ['free',1,3], 1791 | ['init',4,':- '], 1792 | ['free',4,3], 1793 | ['init',7,':- '], 1794 | ['free',7,35], 1795 | ['init',42,':- '], 1796 | ['free',42,3], 1797 | ['init',45,':- '], 1798 | ['free',45,5], 1799 | ['init',50,':- '], 1800 | ['free',50,4], 1801 | ['init',94,':- '], 1802 | ['free',94,36], 1803 | ['init',130,':- '], 1804 | ['free',130,3], 1805 | ['init',133,':- '], 1806 | ['free',133,5], 1807 | ['init',138,':- '], 1808 | ['free',138,4], 1809 | ['init',183,':- '], 1810 | ['free',183,4], 1811 | ['init',187,':- '], 1812 | ['free',187,35], 1813 | ['init',222,':- '], 1814 | ['free',222,3], 1815 | ['init',225,':- '], 1816 | ['free',225,5], 1817 | ['init',230,':- '], 1818 | ['free',230,4], 1819 | ['init',274,':- '], 1820 | ['free',274,6], 1821 | ['init',280,':- '], 1822 | ['free',280,37], 1823 | ['init',317,':- '], 1824 | ['free',317,3], 1825 | ['init',320,':- '], 1826 | ['free',320,5], 1827 | ['init',325,':- '], 1828 | ['free',325,4], 1829 | ['init',371,':- '], 1830 | ['free',371,38], 1831 | ['init',409,':- '], 1832 | ['free',409,3], 1833 | ['init',412,':- '], 1834 | ['free',412,5], 1835 | ['init',417,':- '], 1836 | ['free',417,4], 1837 | ['init',464,':- '], 1838 | ['free',464,10], 1839 | ['init',474,':- '], 1840 | ['free',474,15], 1841 | ['init',489,':- '], 1842 | ['free',489,3], 1843 | ['init',492,':- '], 1844 | ['free',492,5], 1845 | ['init',497,':- '], 1846 | ['free',497,4], 1847 | ['init',521,':- '], 1848 | ['free',521,24], 1849 | ['init',545,':- '], 1850 | ['free',545,3], 1851 | ['init',548,':- '], 1852 | ['free',548,5], 1853 | ['init',553,':- '], 1854 | ['free',553,4], 1855 | ['init',586,':- '], 1856 | ['free',586,27], 1857 | ['init',613,':- '], 1858 | ['free',613,3], 1859 | ['init',616,':- '], 1860 | ['free',616,5], 1861 | ['init',621,':- '], 1862 | ['free',621,4], 1863 | ['init',657,':- '], 1864 | ['free',657,18], 1865 | ['init',675,':- '], 1866 | ['free',675,3], 1867 | ['init',678,':- '], 1868 | ['free',678,5], 1869 | ['init',683,':- '], 1870 | ['free',683,4], 1871 | ['init',710,':- '], 1872 | ['free',710,18], 1873 | ['init',728,':- '], 1874 | ['free',728,29], 1875 | ['init',757,':- '], 1876 | ['free',757,3], 1877 | ['init',760,':- '], 1878 | ['free',760,5], 1879 | ['init',765,':- '], 1880 | ['free',765,4], 1881 | ['init',803,':- '], 1882 | ['free',803,30], 1883 | ['init',833,':- '], 1884 | ['free',833,3], 1885 | ['init',836,':- '], 1886 | ['free',836,5], 1887 | ['init',841,':- '], 1888 | ['free',841,4], 1889 | ['init',880,':- '], 1890 | ['free',880,29], 1891 | ['init',909,':- '], 1892 | ['free',909,3], 1893 | ['init',912,':- '], 1894 | ['free',912,5], 1895 | ['init',917,':- '], 1896 | ['free',917,4], 1897 | ['init',955,':- '], 1898 | ['free',955,31], 1899 | ['init',986,':- '], 1900 | ['free',986,3], 1901 | ['init',989,':- '], 1902 | ['free',989,5], 1903 | ['init',994,':- '], 1904 | ['free',994,4], 1905 | ['init',1034,':- '], 1906 | ['free',1034,34], 1907 | ['init',1068,':- '], 1908 | ['free',1068,3], 1909 | ['init',1071,':- '], 1910 | ['free',1071,5], 1911 | ['init',1076,':- '], 1912 | ['free',1076,4], 1913 | ['init',1119,':- '], 1914 | ['free',1119,22], 1915 | ['init',1141,':- '], 1916 | ['free',1141,3], 1917 | ['init',1144,':- '], 1918 | ['free',1144,5], 1919 | ['init',1149,':- '], 1920 | ['free',1149,4], 1921 | ['init',1183,':- '], 1922 | ['free',1183,3], 1923 | ['init',1193,':- '], 1924 | ['free',1193,3], 1925 | ['init',1196,':- '], 1926 | ['free',1196,4], 1927 | ['init',1213,':- '], 1928 | ['free',1213,3], 1929 | ['init',1216,':- '], 1930 | ['free',1216,4], 1931 | ['init',1220,':- '], 1932 | ['free',1220,4], 1933 | ['init',1237,':- '], 1934 | ['free',1237,3], 1935 | ['init',1240,':- '], 1936 | ['free',1240,6], 1937 | ['init',1257,':- '], 1938 | ['free',1257,3], 1939 | ['init',1260,':- '], 1940 | ['free',1260,4], 1941 | ['init',1277,':- '], 1942 | ['free',1277,3], 1943 | ['bp','data grouped'], 1944 | ['roots',1180,0], 1945 | ['live',0,54,59,87,92,142,148,176,181,234,239,267,272,329,336,364,369,421,429,457,462,501,506,514,519,557,563,579,584,625,632,650,655,687,695,703,708,769,774,796,801,845,851,873,878,921,926,948,953,998,1005,1027,1032,1080,1090,1112,1117,1153,1159,1173,1178,1180,1186,1190,1200,1206,1210,1224,1230,1234,1246,1250,1254,1264,1270,1274,1280,1290,1294,1298,1301], 1946 | // [["Mal",[[10,"Mal","Temple of the Jade Serpent"],[-3,"Mal","Pistol"],[10,"Mal","Shando-Pan Monastery"]]],["Wash",[[10,"Wash","Temple of the Jade Serpent"],[-3,"Wash","Hawaiian Shirt"],[10,"Wash","Shando-Pan Monastery"],[-2,"Wash","Cargo Shorts"]]],["Zoe",[[10,"Zoe","Temple of the Jade Serpent"],[10,"Zoe","Shando-Pan Monastery"]]],["Jayne",[[10,"Jayne","Temple of the Jade Serpent"],[-8,"Jayne","Grenade Launcher"],[10,"Jayne","Shando-Pan Monastery"]]],["Kaylee",[[10,"Kaylee","Temple of the Jade Serpent"],[-1,"Kaylee","Wrench"]]],["Shepherd",[[10,"Shepherd","Shando-Pan Monastery"]]]] 1947 | ['alloc',1304,3], 1948 | ['alloc',1307,3], 1949 | ['init',1307,':<> '], 1950 | ['set',1308,'=1'], 1951 | ['init',1304,':[] '], 1952 | ['set',1305,'=0'], 1953 | ['set',1306,1307], 1954 | ['alloc',1310,4], 1955 | ['init',1310,':<> '], 1956 | ['set',1311,'=2'], 1957 | ['set',1312,54], 1958 | ['alloc',1314,2], 1959 | ['init',1314,':n '], 1960 | ['set',1315,'=0'], 1961 | ['alloc',1316,2], 1962 | ['init',1316,':n '], 1963 | ['set',1317,'=10'], 1964 | ['alloc',1318,2], 1965 | ['init',1318,':n '], 1966 | ['set',1319,'=7'], 1967 | ['alloc',1320,2], 1968 | ['init',1320,':n '], 1969 | ['set',1321,'=17'], 1970 | ['set',1315,'=17'], 1971 | ['set',1313,1314], 1972 | // push ["Mal",17] 1973 | ['set',1309,1310], 1974 | ['set',1305,'=1'], 1975 | ['alloc',1322,4], 1976 | ['init',1322,':<> '], 1977 | ['set',1323,'=2'], 1978 | ['set',1324,142], 1979 | ['alloc',1326,2], 1980 | ['init',1326,':n '], 1981 | ['set',1327,'=0'], 1982 | ['alloc',1328,2], 1983 | ['init',1328,':n '], 1984 | ['set',1329,'=10'], 1985 | ['alloc',1330,2], 1986 | ['init',1330,':n '], 1987 | ['set',1331,'=7'], 1988 | ['alloc',1332,2], 1989 | ['init',1332,':n '], 1990 | ['set',1333,'=17'], 1991 | ['alloc',1334,2], 1992 | ['init',1334,':n '], 1993 | ['set',1335,'=15'], 1994 | ['set',1327,'=15'], 1995 | ['set',1325,1326], 1996 | // push ["Wash",15] 1997 | ['alloc',1336,4], 1998 | ['copy',1336,1307,3], 1999 | ['init',1336,':<> '], 2000 | ['set',1337,'=2'], 2001 | ['set',1306,1336], 2002 | ['set',1339,1322], 2003 | ['set',1305,'=2'], 2004 | ['bp','transaction history reduced'], 2005 | ['roots',1326,1210,1322,1304,1180,0], 2006 | ['live',0,54,59,87,92,142,148,176,181,234,239,267,272,329,336,364,369,421,429,457,462,501,506,514,519,557,563,579,584,625,632,650,655,687,695,703,708,769,774,796,801,845,851,873,878,921,926,948,953,998,1005,1027,1032,1080,1090,1112,1117,1153,1159,1173,1178,1180,1186,1190,1200,1206,1210,1224,1230,1234,1246,1250,1254,1264,1270,1274,1280,1290,1294,1298,1301,1304,1310,1314,1322,1326,1336], 2007 | ['alloc',1340,4], 2008 | ['init',1340,':<> '], 2009 | ['set',1341,'=2'], 2010 | ['set',1342,234], 2011 | ['alloc',1344,2], 2012 | ['init',1344,':n '], 2013 | ['set',1345,'=0'], 2014 | ['alloc',1346,2], 2015 | ['init',1346,':n '], 2016 | ['set',1347,'=10'], 2017 | ['alloc',1348,2], 2018 | ['init',1348,':n '], 2019 | ['set',1349,'=20'], 2020 | ['set',1345,'=20'], 2021 | ['set',1343,1344], 2022 | // push ["Zoe",20] 2023 | ['alloc',1350,6], 2024 | ['copy',1350,1336,4], 2025 | ['init',1350,':<> '], 2026 | ['set',1351,'=4'], 2027 | ['set',1306,1350], 2028 | ['set',1354,1340], 2029 | ['set',1305,'=3'], 2030 | ['alloc',1356,4], 2031 | ['init',1356,':<> '], 2032 | ['set',1357,'=2'], 2033 | ['set',1358,329], 2034 | ['alloc',1360,2], 2035 | ['init',1360,':n '], 2036 | ['set',1361,'=0'], 2037 | ['alloc',1362,2], 2038 | ['init',1362,':n '], 2039 | ['set',1363,'=10'], 2040 | ['alloc',1364,2], 2041 | ['init',1364,':n '], 2042 | ['set',1365,'=2'], 2043 | ['alloc',1366,2], 2044 | ['init',1366,':n '], 2045 | ['set',1367,'=12'], 2046 | ['set',1361,'=12'], 2047 | ['set',1359,1360], 2048 | // push ["Jayne",12] 2049 | ['set',1355,1356], 2050 | ['set',1305,'=4'], 2051 | ['alloc',1368,4], 2052 | ['init',1368,':<> '], 2053 | ['set',1369,'=2'], 2054 | ['set',1370,421], 2055 | ['alloc',1372,2], 2056 | ['init',1372,':n '], 2057 | ['set',1373,'=0'], 2058 | ['alloc',1374,2], 2059 | ['init',1374,':n '], 2060 | ['set',1375,'=10'], 2061 | ['alloc',1376,2], 2062 | ['init',1376,':n '], 2063 | ['set',1377,'=9'], 2064 | ['set',1373,'=9'], 2065 | ['set',1371,1372], 2066 | // push ["Kaylee",9] 2067 | ['alloc',1378,10], 2068 | ['copy',1378,1350,6], 2069 | ['init',1378,':<> '], 2070 | ['set',1379,'=8'], 2071 | ['set',1306,1378], 2072 | ['set',1384,1368], 2073 | ['set',1305,'=5'], 2074 | ['alloc',1388,4], 2075 | ['init',1388,':<> '], 2076 | ['set',1389,'=2'], 2077 | ['set',1390,1080], 2078 | ['alloc',1392,2], 2079 | ['init',1392,':n '], 2080 | ['set',1393,'=0'], 2081 | ['alloc',1394,2], 2082 | ['init',1394,':n '], 2083 | ['set',1395,'=10'], 2084 | ['set',1393,'=10'], 2085 | ['set',1391,1392], 2086 | // push ["Shepherd",10] 2087 | ['set',1385,1388], 2088 | ['set',1305,'=6'], 2089 | ['ref_count',1304,1], 2090 | ['ref_count',1378,1], 2091 | ['ref_count',1310,1], 2092 | ['ref_count',54,1], 2093 | ['ref_count',1314,1], 2094 | ['ref_count',1322,1], 2095 | ['ref_count',142,1], 2096 | ['ref_count',1326,1], 2097 | ['ref_count',1340,1], 2098 | ['ref_count',234,1], 2099 | ['ref_count',1344,1], 2100 | ['ref_count',1356,1], 2101 | ['ref_count',329,1], 2102 | ['ref_count',1360,1], 2103 | ['ref_count',1368,1], 2104 | ['ref_count',421,1], 2105 | ['ref_count',1372,1], 2106 | ['ref_count',1388,1], 2107 | ['ref_count',1080,1], 2108 | ['ref_count',1392,1], 2109 | ['init',1,':- '], 2110 | ['free',1,3], 2111 | ['init',4,':- '], 2112 | ['free',4,3], 2113 | ['init',7,':- '], 2114 | ['free',7,35], 2115 | ['init',42,':- '], 2116 | ['free',42,3], 2117 | ['init',45,':- '], 2118 | ['free',45,5], 2119 | ['init',50,':- '], 2120 | ['free',50,4], 2121 | ['init',59,':- '], 2122 | ['free',59,28], 2123 | ['init',87,':- '], 2124 | ['free',87,5], 2125 | ['init',92,':- '], 2126 | ['free',92,2], 2127 | ['init',94,':- '], 2128 | ['free',94,36], 2129 | ['init',130,':- '], 2130 | ['free',130,3], 2131 | ['init',133,':- '], 2132 | ['free',133,5], 2133 | ['init',138,':- '], 2134 | ['free',138,4], 2135 | ['init',148,':- '], 2136 | ['free',148,28], 2137 | ['init',176,':- '], 2138 | ['free',176,5], 2139 | ['init',181,':- '], 2140 | ['free',181,2], 2141 | ['init',183,':- '], 2142 | ['free',183,4], 2143 | ['init',187,':- '], 2144 | ['free',187,35], 2145 | ['init',222,':- '], 2146 | ['free',222,3], 2147 | ['init',225,':- '], 2148 | ['free',225,5], 2149 | ['init',230,':- '], 2150 | ['free',230,4], 2151 | ['init',239,':- '], 2152 | ['free',239,28], 2153 | ['init',267,':- '], 2154 | ['free',267,5], 2155 | ['init',272,':- '], 2156 | ['free',272,2], 2157 | ['init',274,':- '], 2158 | ['free',274,6], 2159 | ['init',280,':- '], 2160 | ['free',280,37], 2161 | ['init',317,':- '], 2162 | ['free',317,3], 2163 | ['init',320,':- '], 2164 | ['free',320,5], 2165 | ['init',325,':- '], 2166 | ['free',325,4], 2167 | ['init',336,':- '], 2168 | ['free',336,28], 2169 | ['init',364,':- '], 2170 | ['free',364,5], 2171 | ['init',369,':- '], 2172 | ['free',369,2], 2173 | ['init',371,':- '], 2174 | ['free',371,38], 2175 | ['init',409,':- '], 2176 | ['free',409,3], 2177 | ['init',412,':- '], 2178 | ['free',412,5], 2179 | ['init',417,':- '], 2180 | ['free',417,4], 2181 | ['init',429,':- '], 2182 | ['free',429,28], 2183 | ['init',457,':- '], 2184 | ['free',457,5], 2185 | ['init',462,':- '], 2186 | ['free',462,2], 2187 | ['init',464,':- '], 2188 | ['free',464,10], 2189 | ['init',474,':- '], 2190 | ['free',474,15], 2191 | ['init',489,':- '], 2192 | ['free',489,3], 2193 | ['init',492,':- '], 2194 | ['free',492,5], 2195 | ['init',497,':- '], 2196 | ['free',497,4], 2197 | ['init',501,':- '], 2198 | ['free',501,5], 2199 | ['init',506,':- '], 2200 | ['free',506,8], 2201 | ['init',514,':- '], 2202 | ['free',514,5], 2203 | ['init',519,':- '], 2204 | ['free',519,2], 2205 | ['init',521,':- '], 2206 | ['free',521,24], 2207 | ['init',545,':- '], 2208 | ['free',545,3], 2209 | ['init',548,':- '], 2210 | ['free',548,5], 2211 | ['init',553,':- '], 2212 | ['free',553,4], 2213 | ['init',557,':- '], 2214 | ['free',557,6], 2215 | ['init',563,':- '], 2216 | ['free',563,16], 2217 | ['init',579,':- '], 2218 | ['free',579,5], 2219 | ['init',584,':- '], 2220 | ['free',584,2], 2221 | ['init',586,':- '], 2222 | ['free',586,27], 2223 | ['init',613,':- '], 2224 | ['free',613,3], 2225 | ['init',616,':- '], 2226 | ['free',616,5], 2227 | ['init',621,':- '], 2228 | ['free',621,4], 2229 | ['init',625,':- '], 2230 | ['free',625,7], 2231 | ['init',632,':- '], 2232 | ['free',632,18], 2233 | ['init',650,':- '], 2234 | ['free',650,5], 2235 | ['init',655,':- '], 2236 | ['free',655,2], 2237 | ['init',657,':- '], 2238 | ['free',657,18], 2239 | ['init',675,':- '], 2240 | ['free',675,3], 2241 | ['init',678,':- '], 2242 | ['free',678,5], 2243 | ['init',683,':- '], 2244 | ['free',683,4], 2245 | ['init',687,':- '], 2246 | ['free',687,8], 2247 | ['init',695,':- '], 2248 | ['free',695,8], 2249 | ['init',703,':- '], 2250 | ['free',703,5], 2251 | ['init',708,':- '], 2252 | ['free',708,2], 2253 | ['init',710,':- '], 2254 | ['free',710,18], 2255 | ['init',728,':- '], 2256 | ['free',728,29], 2257 | ['init',757,':- '], 2258 | ['free',757,3], 2259 | ['init',760,':- '], 2260 | ['free',760,5], 2261 | ['init',765,':- '], 2262 | ['free',765,4], 2263 | ['init',769,':- '], 2264 | ['free',769,5], 2265 | ['init',774,':- '], 2266 | ['free',774,22], 2267 | ['init',796,':- '], 2268 | ['free',796,5], 2269 | ['init',801,':- '], 2270 | ['free',801,2], 2271 | ['init',803,':- '], 2272 | ['free',803,30], 2273 | ['init',833,':- '], 2274 | ['free',833,3], 2275 | ['init',836,':- '], 2276 | ['free',836,5], 2277 | ['init',841,':- '], 2278 | ['free',841,4], 2279 | ['init',845,':- '], 2280 | ['free',845,6], 2281 | ['init',851,':- '], 2282 | ['free',851,22], 2283 | ['init',873,':- '], 2284 | ['free',873,5], 2285 | ['init',878,':- '], 2286 | ['free',878,2], 2287 | ['init',880,':- '], 2288 | ['free',880,29], 2289 | ['init',909,':- '], 2290 | ['free',909,3], 2291 | ['init',912,':- '], 2292 | ['free',912,5], 2293 | ['init',917,':- '], 2294 | ['free',917,4], 2295 | ['init',921,':- '], 2296 | ['free',921,5], 2297 | ['init',926,':- '], 2298 | ['free',926,22], 2299 | ['init',948,':- '], 2300 | ['free',948,5], 2301 | ['init',953,':- '], 2302 | ['free',953,2], 2303 | ['init',955,':- '], 2304 | ['free',955,31], 2305 | ['init',986,':- '], 2306 | ['free',986,3], 2307 | ['init',989,':- '], 2308 | ['free',989,5], 2309 | ['init',994,':- '], 2310 | ['free',994,4], 2311 | ['init',998,':- '], 2312 | ['free',998,7], 2313 | ['init',1005,':- '], 2314 | ['free',1005,22], 2315 | ['init',1027,':- '], 2316 | ['free',1027,5], 2317 | ['init',1032,':- '], 2318 | ['free',1032,2], 2319 | ['init',1034,':- '], 2320 | ['free',1034,34], 2321 | ['init',1068,':- '], 2322 | ['free',1068,3], 2323 | ['init',1071,':- '], 2324 | ['free',1071,5], 2325 | ['init',1076,':- '], 2326 | ['free',1076,4], 2327 | ['init',1090,':- '], 2328 | ['free',1090,22], 2329 | ['init',1112,':- '], 2330 | ['free',1112,5], 2331 | ['init',1117,':- '], 2332 | ['free',1117,2], 2333 | ['init',1119,':- '], 2334 | ['free',1119,22], 2335 | ['init',1141,':- '], 2336 | ['free',1141,3], 2337 | ['init',1144,':- '], 2338 | ['free',1144,5], 2339 | ['init',1149,':- '], 2340 | ['free',1149,4], 2341 | ['init',1153,':- '], 2342 | ['free',1153,6], 2343 | ['init',1159,':- '], 2344 | ['free',1159,14], 2345 | ['init',1173,':- '], 2346 | ['free',1173,5], 2347 | ['init',1178,':- '], 2348 | ['free',1178,2], 2349 | ['init',1180,':- '], 2350 | ['free',1180,3], 2351 | ['init',1183,':- '], 2352 | ['free',1183,3], 2353 | ['init',1186,':- '], 2354 | ['free',1186,4], 2355 | ['init',1190,':- '], 2356 | ['free',1190,3], 2357 | ['init',1193,':- '], 2358 | ['free',1193,3], 2359 | ['init',1196,':- '], 2360 | ['free',1196,4], 2361 | ['init',1200,':- '], 2362 | ['free',1200,6], 2363 | ['init',1206,':- '], 2364 | ['free',1206,4], 2365 | ['init',1210,':- '], 2366 | ['free',1210,3], 2367 | ['init',1213,':- '], 2368 | ['free',1213,3], 2369 | ['init',1216,':- '], 2370 | ['free',1216,4], 2371 | ['init',1220,':- '], 2372 | ['free',1220,4], 2373 | ['init',1224,':- '], 2374 | ['free',1224,6], 2375 | ['init',1230,':- '], 2376 | ['free',1230,4], 2377 | ['init',1234,':- '], 2378 | ['free',1234,3], 2379 | ['init',1237,':- '], 2380 | ['free',1237,3], 2381 | ['init',1240,':- '], 2382 | ['free',1240,6], 2383 | ['init',1246,':- '], 2384 | ['free',1246,4], 2385 | ['init',1250,':- '], 2386 | ['free',1250,4], 2387 | ['init',1254,':- '], 2388 | ['free',1254,3], 2389 | ['init',1257,':- '], 2390 | ['free',1257,3], 2391 | ['init',1260,':- '], 2392 | ['free',1260,4], 2393 | ['init',1264,':- '], 2394 | ['free',1264,6], 2395 | ['init',1270,':- '], 2396 | ['free',1270,4], 2397 | ['init',1274,':- '], 2398 | ['free',1274,3], 2399 | ['init',1277,':- '], 2400 | ['free',1277,3], 2401 | ['init',1280,':- '], 2402 | ['free',1280,10], 2403 | ['init',1290,':- '], 2404 | ['free',1290,4], 2405 | ['init',1294,':- '], 2406 | ['free',1294,4], 2407 | ['init',1298,':- '], 2408 | ['free',1298,3], 2409 | ['init',1301,':- '], 2410 | ['free',1301,3], 2411 | ['init',1307,':- '], 2412 | ['free',1307,3], 2413 | ['init',1316,':- '], 2414 | ['free',1316,2], 2415 | ['init',1318,':- '], 2416 | ['free',1318,2], 2417 | ['init',1320,':- '], 2418 | ['free',1320,2], 2419 | ['init',1328,':- '], 2420 | ['free',1328,2], 2421 | ['init',1330,':- '], 2422 | ['free',1330,2], 2423 | ['init',1332,':- '], 2424 | ['free',1332,2], 2425 | ['init',1334,':- '], 2426 | ['free',1334,2], 2427 | ['init',1336,':- '], 2428 | ['free',1336,4], 2429 | ['init',1346,':- '], 2430 | ['free',1346,2], 2431 | ['init',1348,':- '], 2432 | ['free',1348,2], 2433 | ['init',1350,':- '], 2434 | ['free',1350,6], 2435 | ['init',1362,':- '], 2436 | ['free',1362,2], 2437 | ['init',1364,':- '], 2438 | ['free',1364,2], 2439 | ['init',1366,':- '], 2440 | ['free',1366,2], 2441 | ['init',1374,':- '], 2442 | ['free',1374,2], 2443 | ['init',1376,':- '], 2444 | ['free',1376,2], 2445 | ['init',1394,':- '], 2446 | ['free',1394,2], 2447 | ['alloc',1396,3], 2448 | ['alloc',1399,8], 2449 | ['init',1399,':<> '], 2450 | ['set',1400,'=6'], 2451 | ['init',1396,':[] '], 2452 | ['set',1397,'=0'], 2453 | ['set',1398,1399], 2454 | // push ["Zoe",20] 2455 | ['set',1401,1340], 2456 | ['set',1397,'=1'], 2457 | // push ["Mal",17] 2458 | ['set',1402,1310], 2459 | ['set',1397,'=2'], 2460 | // push ["Wash",15] 2461 | ['set',1403,1322], 2462 | ['set',1397,'=3'], 2463 | // push ["Jayne",12] 2464 | ['set',1404,1356], 2465 | ['set',1397,'=4'], 2466 | // push ["Shepherd",10] 2467 | ['set',1405,1388], 2468 | ['set',1397,'=5'], 2469 | // push ["Kaylee",9] 2470 | ['set',1406,1368], 2471 | ['set',1397,'=6'], 2472 | ['ref_count',1396,1], 2473 | ['ref_count',1399,1], 2474 | ['ref_count',1340,1], 2475 | ['ref_count',234,1], 2476 | ['ref_count',1344,1], 2477 | ['ref_count',1310,1], 2478 | ['ref_count',54,1], 2479 | ['ref_count',1314,1], 2480 | ['ref_count',1322,1], 2481 | ['ref_count',142,1], 2482 | ['ref_count',1326,1], 2483 | ['ref_count',1356,1], 2484 | ['ref_count',329,1], 2485 | ['ref_count',1360,1], 2486 | ['ref_count',1388,1], 2487 | ['ref_count',1080,1], 2488 | ['ref_count',1392,1], 2489 | ['ref_count',1368,1], 2490 | ['ref_count',421,1], 2491 | ['ref_count',1372,1], 2492 | ['init',1,':- '], 2493 | ['free',1,3], 2494 | ['init',4,':- '], 2495 | ['free',4,3], 2496 | ['init',7,':- '], 2497 | ['free',7,35], 2498 | ['init',42,':- '], 2499 | ['free',42,3], 2500 | ['init',45,':- '], 2501 | ['free',45,5], 2502 | ['init',50,':- '], 2503 | ['free',50,4], 2504 | ['init',59,':- '], 2505 | ['free',59,28], 2506 | ['init',87,':- '], 2507 | ['free',87,5], 2508 | ['init',92,':- '], 2509 | ['free',92,2], 2510 | ['init',94,':- '], 2511 | ['free',94,36], 2512 | ['init',130,':- '], 2513 | ['free',130,3], 2514 | ['init',133,':- '], 2515 | ['free',133,5], 2516 | ['init',138,':- '], 2517 | ['free',138,4], 2518 | ['init',148,':- '], 2519 | ['free',148,28], 2520 | ['init',176,':- '], 2521 | ['free',176,5], 2522 | ['init',181,':- '], 2523 | ['free',181,2], 2524 | ['init',183,':- '], 2525 | ['free',183,4], 2526 | ['init',187,':- '], 2527 | ['free',187,35], 2528 | ['init',222,':- '], 2529 | ['free',222,3], 2530 | ['init',225,':- '], 2531 | ['free',225,5], 2532 | ['init',230,':- '], 2533 | ['free',230,4], 2534 | ['init',239,':- '], 2535 | ['free',239,28], 2536 | ['init',267,':- '], 2537 | ['free',267,5], 2538 | ['init',272,':- '], 2539 | ['free',272,2], 2540 | ['init',274,':- '], 2541 | ['free',274,6], 2542 | ['init',280,':- '], 2543 | ['free',280,37], 2544 | ['init',317,':- '], 2545 | ['free',317,3], 2546 | ['init',320,':- '], 2547 | ['free',320,5], 2548 | ['init',325,':- '], 2549 | ['free',325,4], 2550 | ['init',336,':- '], 2551 | ['free',336,28], 2552 | ['init',364,':- '], 2553 | ['free',364,5], 2554 | ['init',369,':- '], 2555 | ['free',369,2], 2556 | ['init',371,':- '], 2557 | ['free',371,38], 2558 | ['init',409,':- '], 2559 | ['free',409,3], 2560 | ['init',412,':- '], 2561 | ['free',412,5], 2562 | ['init',417,':- '], 2563 | ['free',417,4], 2564 | ['init',429,':- '], 2565 | ['free',429,28], 2566 | ['init',457,':- '], 2567 | ['free',457,5], 2568 | ['init',462,':- '], 2569 | ['free',462,2], 2570 | ['init',464,':- '], 2571 | ['free',464,10], 2572 | ['init',474,':- '], 2573 | ['free',474,15], 2574 | ['init',489,':- '], 2575 | ['free',489,3], 2576 | ['init',492,':- '], 2577 | ['free',492,5], 2578 | ['init',497,':- '], 2579 | ['free',497,4], 2580 | ['init',501,':- '], 2581 | ['free',501,5], 2582 | ['init',506,':- '], 2583 | ['free',506,8], 2584 | ['init',514,':- '], 2585 | ['free',514,5], 2586 | ['init',519,':- '], 2587 | ['free',519,2], 2588 | ['init',521,':- '], 2589 | ['free',521,24], 2590 | ['init',545,':- '], 2591 | ['free',545,3], 2592 | ['init',548,':- '], 2593 | ['free',548,5], 2594 | ['init',553,':- '], 2595 | ['free',553,4], 2596 | ['init',557,':- '], 2597 | ['free',557,6], 2598 | ['init',563,':- '], 2599 | ['free',563,16], 2600 | ['init',579,':- '], 2601 | ['free',579,5], 2602 | ['init',584,':- '], 2603 | ['free',584,2], 2604 | ['init',586,':- '], 2605 | ['free',586,27], 2606 | ['init',613,':- '], 2607 | ['free',613,3], 2608 | ['init',616,':- '], 2609 | ['free',616,5], 2610 | ['init',621,':- '], 2611 | ['free',621,4], 2612 | ['init',625,':- '], 2613 | ['free',625,7], 2614 | ['init',632,':- '], 2615 | ['free',632,18], 2616 | ['init',650,':- '], 2617 | ['free',650,5], 2618 | ['init',655,':- '], 2619 | ['free',655,2], 2620 | ['init',657,':- '], 2621 | ['free',657,18], 2622 | ['init',675,':- '], 2623 | ['free',675,3], 2624 | ['init',678,':- '], 2625 | ['free',678,5], 2626 | ['init',683,':- '], 2627 | ['free',683,4], 2628 | ['init',687,':- '], 2629 | ['free',687,8], 2630 | ['init',695,':- '], 2631 | ['free',695,8], 2632 | ['init',703,':- '], 2633 | ['free',703,5], 2634 | ['init',708,':- '], 2635 | ['free',708,2], 2636 | ['init',710,':- '], 2637 | ['free',710,18], 2638 | ['init',728,':- '], 2639 | ['free',728,29], 2640 | ['init',757,':- '], 2641 | ['free',757,3], 2642 | ['init',760,':- '], 2643 | ['free',760,5], 2644 | ['init',765,':- '], 2645 | ['free',765,4], 2646 | ['init',769,':- '], 2647 | ['free',769,5], 2648 | ['init',774,':- '], 2649 | ['free',774,22], 2650 | ['init',796,':- '], 2651 | ['free',796,5], 2652 | ['init',801,':- '], 2653 | ['free',801,2], 2654 | ['init',803,':- '], 2655 | ['free',803,30], 2656 | ['init',833,':- '], 2657 | ['free',833,3], 2658 | ['init',836,':- '], 2659 | ['free',836,5], 2660 | ['init',841,':- '], 2661 | ['free',841,4], 2662 | ['init',845,':- '], 2663 | ['free',845,6], 2664 | ['init',851,':- '], 2665 | ['free',851,22], 2666 | ['init',873,':- '], 2667 | ['free',873,5], 2668 | ['init',878,':- '], 2669 | ['free',878,2], 2670 | ['init',880,':- '], 2671 | ['free',880,29], 2672 | ['init',909,':- '], 2673 | ['free',909,3], 2674 | ['init',912,':- '], 2675 | ['free',912,5], 2676 | ['init',917,':- '], 2677 | ['free',917,4], 2678 | ['init',921,':- '], 2679 | ['free',921,5], 2680 | ['init',926,':- '], 2681 | ['free',926,22], 2682 | ['init',948,':- '], 2683 | ['free',948,5], 2684 | ['init',953,':- '], 2685 | ['free',953,2], 2686 | ['init',955,':- '], 2687 | ['free',955,31], 2688 | ['init',986,':- '], 2689 | ['free',986,3], 2690 | ['init',989,':- '], 2691 | ['free',989,5], 2692 | ['init',994,':- '], 2693 | ['free',994,4], 2694 | ['init',998,':- '], 2695 | ['free',998,7], 2696 | ['init',1005,':- '], 2697 | ['free',1005,22], 2698 | ['init',1027,':- '], 2699 | ['free',1027,5], 2700 | ['init',1032,':- '], 2701 | ['free',1032,2], 2702 | ['init',1034,':- '], 2703 | ['free',1034,34], 2704 | ['init',1068,':- '], 2705 | ['free',1068,3], 2706 | ['init',1071,':- '], 2707 | ['free',1071,5], 2708 | ['init',1076,':- '], 2709 | ['free',1076,4], 2710 | ['init',1090,':- '], 2711 | ['free',1090,22], 2712 | ['init',1112,':- '], 2713 | ['free',1112,5], 2714 | ['init',1117,':- '], 2715 | ['free',1117,2], 2716 | ['init',1119,':- '], 2717 | ['free',1119,22], 2718 | ['init',1141,':- '], 2719 | ['free',1141,3], 2720 | ['init',1144,':- '], 2721 | ['free',1144,5], 2722 | ['init',1149,':- '], 2723 | ['free',1149,4], 2724 | ['init',1153,':- '], 2725 | ['free',1153,6], 2726 | ['init',1159,':- '], 2727 | ['free',1159,14], 2728 | ['init',1173,':- '], 2729 | ['free',1173,5], 2730 | ['init',1178,':- '], 2731 | ['free',1178,2], 2732 | ['init',1180,':- '], 2733 | ['free',1180,3], 2734 | ['init',1183,':- '], 2735 | ['free',1183,3], 2736 | ['init',1186,':- '], 2737 | ['free',1186,4], 2738 | ['init',1190,':- '], 2739 | ['free',1190,3], 2740 | ['init',1193,':- '], 2741 | ['free',1193,3], 2742 | ['init',1196,':- '], 2743 | ['free',1196,4], 2744 | ['init',1200,':- '], 2745 | ['free',1200,6], 2746 | ['init',1206,':- '], 2747 | ['free',1206,4], 2748 | ['init',1210,':- '], 2749 | ['free',1210,3], 2750 | ['init',1213,':- '], 2751 | ['free',1213,3], 2752 | ['init',1216,':- '], 2753 | ['free',1216,4], 2754 | ['init',1220,':- '], 2755 | ['free',1220,4], 2756 | ['init',1224,':- '], 2757 | ['free',1224,6], 2758 | ['init',1230,':- '], 2759 | ['free',1230,4], 2760 | ['init',1234,':- '], 2761 | ['free',1234,3], 2762 | ['init',1237,':- '], 2763 | ['free',1237,3], 2764 | ['init',1240,':- '], 2765 | ['free',1240,6], 2766 | ['init',1246,':- '], 2767 | ['free',1246,4], 2768 | ['init',1250,':- '], 2769 | ['free',1250,4], 2770 | ['init',1254,':- '], 2771 | ['free',1254,3], 2772 | ['init',1257,':- '], 2773 | ['free',1257,3], 2774 | ['init',1260,':- '], 2775 | ['free',1260,4], 2776 | ['init',1264,':- '], 2777 | ['free',1264,6], 2778 | ['init',1270,':- '], 2779 | ['free',1270,4], 2780 | ['init',1274,':- '], 2781 | ['free',1274,3], 2782 | ['init',1277,':- '], 2783 | ['free',1277,3], 2784 | ['init',1280,':- '], 2785 | ['free',1280,10], 2786 | ['init',1290,':- '], 2787 | ['free',1290,4], 2788 | ['init',1294,':- '], 2789 | ['free',1294,4], 2790 | ['init',1298,':- '], 2791 | ['free',1298,3], 2792 | ['init',1301,':- '], 2793 | ['free',1301,3], 2794 | ['init',1304,':- '], 2795 | ['free',1304,3], 2796 | ['init',1307,':- '], 2797 | ['free',1307,3], 2798 | ['init',1316,':- '], 2799 | ['free',1316,2], 2800 | ['init',1318,':- '], 2801 | ['free',1318,2], 2802 | ['init',1320,':- '], 2803 | ['free',1320,2], 2804 | ['init',1328,':- '], 2805 | ['free',1328,2], 2806 | ['init',1330,':- '], 2807 | ['free',1330,2], 2808 | ['init',1332,':- '], 2809 | ['free',1332,2], 2810 | ['init',1334,':- '], 2811 | ['free',1334,2], 2812 | ['init',1336,':- '], 2813 | ['free',1336,4], 2814 | ['init',1346,':- '], 2815 | ['free',1346,2], 2816 | ['init',1348,':- '], 2817 | ['free',1348,2], 2818 | ['init',1350,':- '], 2819 | ['free',1350,6], 2820 | ['init',1362,':- '], 2821 | ['free',1362,2], 2822 | ['init',1364,':- '], 2823 | ['free',1364,2], 2824 | ['init',1366,':- '], 2825 | ['free',1366,2], 2826 | ['init',1374,':- '], 2827 | ['free',1374,2], 2828 | ['init',1376,':- '], 2829 | ['free',1376,2], 2830 | ['init',1378,':- '], 2831 | ['free',1378,10], 2832 | ['init',1394,':- '], 2833 | ['free',1394,2], 2834 | ['bp','ranking finished'], 2835 | ['roots',1396,0], 2836 | ['live',0,54,142,234,329,421,1080,1310,1314,1322,1326,1340,1344,1356,1360,1368,1372,1388,1392,1396,1399], 2837 | // [["Zoe",20],["Mal",17],["Wash",15],["Jayne",12],["Shepherd",10],["Kaylee",9]] 2838 | ['stop']]; 2839 | --------------------------------------------------------------------------------