summaryrefslogtreecommitdiffhomepage
path: root/samples/07_advanced_rendering
diff options
context:
space:
mode:
Diffstat (limited to 'samples/07_advanced_rendering')
-rw-r--r--samples/07_advanced_rendering/01_simple_render_targets/app/main.rb52
-rw-r--r--samples/07_advanced_rendering/02_render_targets_with_alphas/app/main.rb95
-rw-r--r--samples/07_advanced_rendering/02_render_targets_with_alphas/license-for-sample.txt9
-rw-r--r--samples/07_advanced_rendering/03_render_target_viewports/app/main.rb468
-rw-r--r--samples/07_advanced_rendering/03_render_target_viewports/license-for-sample.txt9
-rw-r--r--samples/07_advanced_rendering/03_render_target_viewports/replay.txt1928
-rw-r--r--samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb172
-rw-r--r--samples/07_advanced_rendering/04_render_primitive_hierarchies/license-for-sample.txt9
-rw-r--r--samples/07_advanced_rendering/04_render_primitive_hierarchies/sprites/ship.pngbin0 -> 1810 bytes
-rw-r--r--samples/07_advanced_rendering/11_render_primitives_as_hash/app/main.rb191
-rw-r--r--samples/07_advanced_rendering/11_render_primitives_as_hash/fonts/manaspc.ttfbin0 -> 9556 bytes
-rw-r--r--samples/07_advanced_rendering/11_render_primitives_as_hash/license-for-sample.txt9
12 files changed, 2942 insertions, 0 deletions
diff --git a/samples/07_advanced_rendering/01_simple_render_targets/app/main.rb b/samples/07_advanced_rendering/01_simple_render_targets/app/main.rb
new file mode 100644
index 0000000..8670453
--- /dev/null
+++ b/samples/07_advanced_rendering/01_simple_render_targets/app/main.rb
@@ -0,0 +1,52 @@
+def tick args
+ # args.outputs.render_targets are really really powerful.
+ # They essentially allow you to create a sprite programmatically and cache the result.
+
+ # Create a render_target of a :block and a :gradient on tick zero.
+ if args.state.tick_count == 0
+ args.render_target(:block).solids << [0, 0, 1280, 100]
+
+ # The gradient is actually just a collection of black solids with increasing
+ # opacities.
+ args.render_target(:gradient).solids << 90.map_with_index do |x|
+ 50.map_with_index do |y|
+ [x * 15, y * 15, 15, 15, 0, 0, 0, (x * 3).fdiv(255) * 255]
+ end
+ end
+ end
+
+ # Take the :block render_target and present it horizontally centered.
+ # Use a subsection of the render_targetd specified by source_x,
+ # source_y, source_w, source_h.
+ args.outputs.sprites << { x: 0,
+ y: 310,
+ w: 1280,
+ h: 100,
+ path: :block,
+ source_x: 0,
+ source_y: 0,
+ source_w: 1280,
+ source_h: 100 }
+
+ # After rendering :block, render gradient on top of :block.
+ args.outputs.sprites << [0, 0, 1280, 720, :gradient]
+
+ args.outputs.labels << [1270, 710, args.gtk.current_framerate, 0, 2, 255, 255, 255]
+ tick_instructions args, "Sample app shows how to use render_targets (programmatically create cached sprites)."
+end
+
+def tick_instructions args, text, y = 715
+ return if args.state.key_event_occurred
+ if args.inputs.mouse.click ||
+ args.inputs.keyboard.directional_vector ||
+ args.inputs.keyboard.key_down.enter ||
+ args.inputs.keyboard.key_down.escape
+ args.state.key_event_occurred = true
+ end
+
+ args.outputs.debug << [0, y - 50, 1280, 60].solid
+ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
+ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
+end
+
+$gtk.reset
diff --git a/samples/07_advanced_rendering/02_render_targets_with_alphas/app/main.rb b/samples/07_advanced_rendering/02_render_targets_with_alphas/app/main.rb
new file mode 100644
index 0000000..2caec43
--- /dev/null
+++ b/samples/07_advanced_rendering/02_render_targets_with_alphas/app/main.rb
@@ -0,0 +1,95 @@
+# This sample is meant to show you how to do that dripping transition thing
+# at the start of the original Doom. Most of this file is here to animate
+# a scene to wipe away; the actual wipe effect is in the last 20 lines or
+# so.
+
+$gtk.reset # reset all game state if reloaded.
+
+def circle_of_blocks pass, xoffset, yoffset, angleoffset, blocksize, distance
+ numblocks = 10
+
+ for i in 1..numblocks do
+ angle = ((360 / numblocks) * i) + angleoffset
+ radians = angle * (Math::PI / 180)
+ x = (xoffset + (distance * Math.cos(radians))).round
+ y = (yoffset + (distance * Math.sin(radians))).round
+ pass.solids << [ x, y, blocksize, blocksize, 255, 255, 0 ]
+ end
+end
+
+def draw_scene args, pass
+ pass.solids << [0, 360, 1280, 360, 0, 0, 200]
+ pass.solids << [0, 0, 1280, 360, 0, 127, 0]
+
+ blocksize = 100
+ angleoffset = args.state.tick_count * 2.5
+ centerx = (1280 - blocksize) / 2
+ centery = (720 - blocksize) / 2
+
+ circle_of_blocks pass, centerx, centery, angleoffset, blocksize * 2, 500
+ circle_of_blocks pass, centerx, centery, angleoffset, blocksize, 325
+ circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 2, 200
+ circle_of_blocks pass, centerx, centery, angleoffset, blocksize / 4, 100
+end
+
+def tick args
+ segments = 160
+
+ # On the first tick, initialize some stuff.
+ if !args.state.yoffsets
+ args.state.baseyoff = 0
+ args.state.yoffsets = []
+ for i in 0..segments do
+ args.state.yoffsets << rand * 100
+ end
+ end
+
+ # Just draw some random stuff for a few seconds.
+ args.state.static_debounce ||= 60 * 2.5
+ if args.state.static_debounce > 0
+ last_frame = args.state.static_debounce == 1
+ target = last_frame ? args.render_target(:last_frame) : args.outputs
+ draw_scene args, target
+ args.state.static_debounce -= 1
+ return unless last_frame
+ end
+
+ # build up the wipe...
+
+ # this is the thing we're wiping to.
+ args.outputs.sprites << [ 0, 0, 1280, 720, 'dragonruby.png' ]
+
+ return if (args.state.baseyoff > (1280 + 100)) # stop when done sliding
+
+ segmentw = 1280 / segments
+
+ x = 0
+ for i in 0..segments do
+ yoffset = 0
+ if args.state.yoffsets[i] < args.state.baseyoff
+ yoffset = args.state.baseyoff - args.state.yoffsets[i]
+ end
+
+ # (720 - yoffset) flips the coordinate system, (- 720) adjusts for the height of the segment.
+ args.outputs.sprites << [ x, (720 - yoffset) - 720, segmentw, 720, 'last_frame', 0, 255, 255, 255, 255, x, 0, segmentw, 720 ]
+ x += segmentw
+ end
+
+ args.state.baseyoff += 4
+
+ tick_instructions args, "Sample app shows an advanced usage of render_target."
+end
+
+def tick_instructions args, text, y = 715
+ return if args.state.key_event_occurred
+ if args.inputs.mouse.click ||
+ args.inputs.keyboard.directional_vector ||
+ args.inputs.keyboard.key_down.enter ||
+ args.inputs.keyboard.key_down.escape
+ args.state.key_event_occurred = true
+ end
+
+ args.outputs.debug << [0, y - 50, 1280, 60].solid
+ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
+ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
+end
diff --git a/samples/07_advanced_rendering/02_render_targets_with_alphas/license-for-sample.txt b/samples/07_advanced_rendering/02_render_targets_with_alphas/license-for-sample.txt
new file mode 100644
index 0000000..100dcec
--- /dev/null
+++ b/samples/07_advanced_rendering/02_render_targets_with_alphas/license-for-sample.txt
@@ -0,0 +1,9 @@
+Copyright 2019 DragonRuby LLC
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/samples/07_advanced_rendering/03_render_target_viewports/app/main.rb b/samples/07_advanced_rendering/03_render_target_viewports/app/main.rb
new file mode 100644
index 0000000..dbceab3
--- /dev/null
+++ b/samples/07_advanced_rendering/03_render_target_viewports/app/main.rb
@@ -0,0 +1,468 @@
+=begin
+
+ APIs listing that haven't been encountered in previous sample apps:
+
+ - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
+ For example, if we want to create a new button, we would declare it as a new entity and
+ then define its properties. (Remember, you can use state to define ANY property and it will
+ be retained across frames.)
+
+ If you have a solar system and you're creating args.state.sun and setting its image path to an
+ image in the sprites folder, you would do the following:
+ (See samples/99_sample_nddnug_workshop for more details.)
+
+ args.state.sun ||= args.state.new_entity(:sun) do |s|
+ s.path = 'sprites/sun.png'
+ end
+
+ - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
+ as Ruby code, and the placeholder is replaced with its corresponding value or result.
+
+ For example, if we have a variable
+ name = "Ruby"
+ then the line
+ puts "How are you, #{name}?"
+ would print "How are you, Ruby?" to the console.
+ (Remember, string interpolation only works with double quotes!)
+
+ - Ternary operator (?): Similar to if statement; first evalulates whether a statement is
+ true or false, and then executes a command depending on that result.
+ For example, if we had a variable
+ grade = 75
+ and used the ternary operator in the command
+ pass_or_fail = grade > 65 ? "pass" : "fail"
+ then the value of pass_or_fail would be "pass" since grade's value was greater than 65.
+
+ Reminders:
+
+ - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual
+ 720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).
+
+ - Numeric#shift_(left|right|up|down): Shifts the Numeric in the correct direction
+ by adding or subracting.
+
+ - ARRAY#inside_rect?: An array with at least two values is considered a point. An array
+ with at least four values is considered a rect. The inside_rect? function returns true
+ or false depending on if the point is inside the rect.
+
+ - ARRAY#intersect_rect?: Returns true or false depending on if the two rectangles intersect.
+
+ - args.inputs.mouse.click: This property will be set if the mouse was clicked.
+ For more information about the mouse, go to mygame/documentation/07-mouse.md.
+
+ - args.inputs.keyboard.key_up.KEY: The value of the properties will be set
+ to the frame that the key_up event occurred (the frame correlates
+ to args.state.tick_count).
+ For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
+
+ - args.state.labels:
+ The parameters for a label are
+ 1. the position (x, y)
+ 2. the text
+ 3. the size
+ 4. the alignment
+ 5. the color (red, green, and blue saturations)
+ 6. the alpha (or transparency)
+ For more information about labels, go to mygame/documentation/02-labels.md.
+
+ - args.state.lines:
+ The parameters for a line are
+ 1. the starting position (x, y)
+ 2. the ending position (x2, y2)
+ 3. the color (red, green, and blue saturations)
+ 4. the alpha (or transparency)
+ For more information about lines, go to mygame/documentation/04-lines.md.
+
+ - args.state.solids (and args.state.borders):
+ The parameters for a solid (or border) are
+ 1. the position (x, y)
+ 2. the width (w)
+ 3. the height (h)
+ 4. the color (r, g, b)
+ 5. the alpha (or transparency)
+ For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.
+
+ - args.state.sprites:
+ The parameters for a sprite are
+ 1. the position (x, y)
+ 2. the width (w)
+ 3. the height (h)
+ 4. the image path
+ 5. the angle
+ 6. the alpha (or transparency)
+ For more information about sprites, go to mygame/documentation/05-sprites.md.
+=end
+
+# This sample app shows different objects that can be used when making games, such as labels,
+# lines, sprites, solids, buttons, etc. Each demo section shows how these objects can be used.
+
+# Also note that state.tick_count refers to the passage of time, or current frame.
+
+class TechDemo
+ attr_accessor :inputs, :state, :outputs, :grid, :args
+
+ # Calls all methods necessary for the app to run properly.
+ def tick
+ labels_tech_demo
+ lines_tech_demo
+ solids_tech_demo
+ borders_tech_demo
+ sprites_tech_demo
+ keyboards_tech_demo
+ controller_tech_demo
+ mouse_tech_demo
+ point_to_rect_tech_demo
+ rect_to_rect_tech_demo
+ button_tech_demo
+ export_game_state_demo
+ window_state_demo
+ render_seperators
+ end
+
+ # Shows output of different kinds of labels on the screen
+ def labels_tech_demo
+ outputs.labels << [grid.left.shift_right(5), grid.top.shift_down(5), "This is a label located at the top left."]
+ outputs.labels << [grid.left.shift_right(5), grid.bottom.shift_up(30), "This is a label located at the bottom left."]
+ outputs.labels << [ 5, 690, "Labels (x, y, text, size, align, r, g, b, a)"]
+ outputs.labels << [ 5, 660, "Smaller label.", -2]
+ outputs.labels << [ 5, 630, "Small label.", -1]
+ outputs.labels << [ 5, 600, "Medium label.", 0]
+ outputs.labels << [ 5, 570, "Large label.", 1]
+ outputs.labels << [ 5, 540, "Larger label.", 2]
+ outputs.labels << [300, 660, "Left aligned.", 0, 2]
+ outputs.labels << [300, 640, "Center aligned.", 0, 1]
+ outputs.labels << [300, 620, "Right aligned.", 0, 0]
+ outputs.labels << [175, 595, "Red Label.", 0, 0, 255, 0, 0]
+ outputs.labels << [175, 575, "Green Label.", 0, 0, 0, 255, 0]
+ outputs.labels << [175, 555, "Blue Label.", 0, 0, 0, 0, 255]
+ outputs.labels << [175, 535, "Faded Label.", 0, 0, 0, 0, 0, 128]
+ end
+
+ # Shows output of lines on the screen
+ def lines_tech_demo
+ outputs.labels << [5, 500, "Lines (x, y, x2, y2, r, g, b, a)"]
+ outputs.lines << [5, 450, 100, 450]
+ outputs.lines << [5, 430, 300, 430]
+ outputs.lines << [5, 410, 300, 410, state.tick_count % 255, 0, 0, 255] # red saturation changes
+ outputs.lines << [5, 390 - state.tick_count % 25, 300, 390, 0, 0, 0, 255] # y position changes
+ outputs.lines << [5 + state.tick_count % 200, 360, 300, 360, 0, 0, 0, 255] # x position changes
+ end
+
+ # Shows output of different kinds of solids on the screen
+ def solids_tech_demo
+ outputs.labels << [ 5, 350, "Solids (x, y, w, h, r, g, b, a)"]
+ outputs.solids << [ 10, 270, 50, 50]
+ outputs.solids << [ 70, 270, 50, 50, 0, 0, 0]
+ outputs.solids << [130, 270, 50, 50, 255, 0, 0]
+ outputs.solids << [190, 270, 50, 50, 255, 0, 0, 128]
+ outputs.solids << [250, 270, 50, 50, 0, 0, 0, 128 + state.tick_count % 128] # transparency changes
+ end
+
+ # Shows output of different kinds of borders on the screen
+ # The parameters for a border are the same as the parameters for a solid
+ def borders_tech_demo
+ outputs.labels << [ 5, 260, "Borders (x, y, w, h, r, g, b, a)"]
+ outputs.borders << [ 10, 180, 50, 50]
+ outputs.borders << [ 70, 180, 50, 50, 0, 0, 0]
+ outputs.borders << [130, 180, 50, 50, 255, 0, 0]
+ outputs.borders << [190, 180, 50, 50, 255, 0, 0, 128]
+ outputs.borders << [250, 180, 50, 50, 0, 0, 0, 128 + state.tick_count % 128] # transparency changes
+ end
+
+ # Shows output of different kinds of sprites on the screen
+ def sprites_tech_demo
+ outputs.labels << [ 5, 170, "Sprites (x, y, w, h, path, angle, a)"]
+ outputs.sprites << [ 10, 40, 128, 101, 'dragonruby.png']
+ outputs.sprites << [ 150, 40, 128, 101, 'dragonruby.png', state.tick_count % 360] # angle changes
+ outputs.sprites << [ 300, 40, 128, 101, 'dragonruby.png', 0, state.tick_count % 255] # transparency changes
+ end
+
+ # Holds size, alignment, color (black), and alpha (transparency) parameters
+ # Using small_font as a parameter accounts for all remaining parameters
+ # so they don't have to be repeatedly typed
+ def small_font
+ [-2, 0, 0, 0, 0, 255]
+ end
+
+ # Sets position of each row
+ # Converts given row value to pixels that DragonRuby understands
+ def row_to_px row_number
+
+ # Row 0 starts 5 units below the top of the grid.
+ # Each row afterward is 20 units lower.
+ grid.top.shift_down(5).shift_down(20 * row_number)
+ end
+
+ # Uses labels to output current game time (passage of time), and whether or not "h" was pressed
+ # If "h" is pressed, the frame is output when the key_up event occurred
+ def keyboards_tech_demo
+ outputs.labels << [460, row_to_px(0), "Current game time: #{state.tick_count}", small_font]
+ outputs.labels << [460, row_to_px(2), "Keyboard input: inputs.keyboard.key_up.h", small_font]
+ outputs.labels << [460, row_to_px(3), "Press \"h\" on the keyboard.", small_font]
+
+ if inputs.keyboard.key_up.h # if "h" key_up event occurs
+ state.h_pressed_at = state.tick_count # frame it occurred is stored
+ end
+
+ # h_pressed_at is initially set to false, and changes once the user presses the "h" key.
+ state.h_pressed_at ||= false
+
+ if state.h_pressed_at # if h is pressed (pressed_at has a frame number and is no longer false)
+ outputs.labels << [460, row_to_px(4), "\"h\" was pressed at time: #{state.h_pressed_at}", small_font]
+ else # otherwise, label says "h" was never pressed
+ outputs.labels << [460, row_to_px(4), "\"h\" has never been pressed.", small_font]
+ end
+
+ # border around keyboard input demo section
+ outputs.borders << [455, row_to_px(5), 360, row_to_px(2).shift_up(5) - row_to_px(5)]
+ end
+
+ # Sets definition for a small label
+ # Makes it easier to position labels in respect to the position of other labels
+ def small_label x, row, message
+ [x, row_to_px(row), message, small_font]
+ end
+
+ # Uses small labels to show whether the "a" button on the controller is down, held, or up.
+ # y value of each small label is set by calling the row_to_px method
+ def controller_tech_demo
+ x = 460
+ outputs.labels << small_label(x, 6, "Controller one input: inputs.controller_one")
+ outputs.labels << small_label(x, 7, "Current state of the \"a\" button.")
+ outputs.labels << small_label(x, 8, "Check console window for more info.")
+
+ if inputs.controller_one.key_down.a # if "a" is in "down" state
+ outputs.labels << small_label(x, 9, "\"a\" button down: #{inputs.controller_one.key_down.a}")
+ puts "\"a\" button down at #{inputs.controller_one.key_down.a}" # prints frame the event occurred
+ elsif inputs.controller_one.key_held.a # if "a" is held down
+ outputs.labels << small_label(x, 9, "\"a\" button held: #{inputs.controller_one.key_held.a}")
+ elsif inputs.controller_one.key_up.a # if "a" is in up state
+ outputs.labels << small_label(x, 9, "\"a\" button up: #{inputs.controller_one.key_up.a}")
+ puts "\"a\" key up at #{inputs.controller_one.key_up.a}"
+ else # if no event has occurred
+ outputs.labels << small_label(x, 9, "\"a\" button state is nil.")
+ end
+
+ # border around controller input demo section
+ outputs.borders << [455, row_to_px(10), 360, row_to_px(6).shift_up(5) - row_to_px(10)]
+ end
+
+ # Outputs when the mouse was clicked, as well as the coordinates on the screen
+ # of where the click occurred
+ def mouse_tech_demo
+ x = 460
+
+ outputs.labels << small_label(x, 11, "Mouse input: inputs.mouse")
+
+ if inputs.mouse.click # if click has a value and is not nil
+ state.last_mouse_click = inputs.mouse.click # coordinates of click are stored
+ end
+
+ if state.last_mouse_click # if mouse is clicked (has coordinates as value)
+ # outputs the time (frame) the click occurred, as well as how many frames have passed since the event
+ outputs.labels << small_label(x, 12, "Mouse click happened at: #{state.last_mouse_click.created_at}, #{state.last_mouse_click.created_at_elapsed}")
+ # outputs coordinates of click
+ outputs.labels << small_label(x, 13, "Mouse click location: #{state.last_mouse_click.point.x}, #{state.last_mouse_click.point.y}")
+ else # otherwise if the mouse has not been clicked
+ outputs.labels << small_label(x, 12, "Mouse click has not occurred yet.")
+ outputs.labels << small_label(x, 13, "Please click mouse.")
+ end
+ end
+
+ # Outputs whether a mouse click occurred inside or outside of a box
+ def point_to_rect_tech_demo
+ x = 460
+
+ outputs.labels << small_label(x, 15, "Click inside the blue box maybe ---->")
+
+ box = [765, 370, 50, 50, 0, 0, 170] # blue box
+ outputs.borders << box
+
+ if state.last_mouse_click # if the mouse was clicked
+ if state.last_mouse_click.point.inside_rect? box # if mouse clicked inside box
+ outputs.labels << small_label(x, 16, "Mouse click happened inside the box.")
+ else # otherwise, if mouse was clicked outside the box
+ outputs.labels << small_label(x, 16, "Mouse click happened outside the box.")
+ end
+ else # otherwise, if was not clicked at all
+ outputs.labels << small_label(x, 16, "Mouse click has not occurred yet.") # output if the mouse was not clicked
+ end
+
+ # border around mouse input demo section
+ outputs.borders << [455, row_to_px(14), 360, row_to_px(11).shift_up(5) - row_to_px(14)]
+ end
+
+ # Outputs a red box onto the screen. A mouse click from the user inside of the red box will output
+ # a smaller box. If two small boxes are inside of the red box, it will be determined whether or not
+ # they intersect.
+ def rect_to_rect_tech_demo
+ x = 460
+
+ outputs.labels << small_label(x, 17.5, "Click inside the red box below.") # label with instructions
+ red_box = [460, 250, 355, 90, 170, 0, 0] # definition of the red box
+ outputs.borders << red_box # output as a border (not filled in)
+
+ # If the mouse is clicked inside the red box, two collision boxes are created.
+ if inputs.mouse.click
+ if inputs.mouse.click.point.inside_rect? red_box
+ if !state.box_collision_one # if the collision_one box does not yet have a definition
+ # Subtracts 25 from the x and y positions of the click point in order to make the click point the center of the box.
+ # You can try deleting the subtraction to see how it impacts the box placement.
+ state.box_collision_one = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50, 180, 0, 0, 180] # sets definition
+ elsif !state.box_collision_two # if collision_two does not yet have a definition
+ state.box_collision_two = [inputs.mouse.click.point.x - 25, inputs.mouse.click.point.y - 25, 50, 50, 0, 0, 180, 180] # sets definition
+ else
+ state.box_collision_one = nil # both boxes are empty
+ state.box_collision_two = nil
+ end
+ end
+ end
+
+ # If collision boxes exist, they are output onto screen inside the red box as solids
+ if state.box_collision_one
+ outputs.solids << state.box_collision_one
+ end
+
+ if state.box_collision_two
+ outputs.solids << state.box_collision_two
+ end
+
+ # Outputs whether or not the two collision boxes intersect.
+ if state.box_collision_one && state.box_collision_two # if both collision_boxes are defined (and not nil or empty)
+ if state.box_collision_one.intersect_rect? state.box_collision_two # if the two boxes intersect
+ outputs.labels << small_label(x, 23.5, 'The boxes intersect.')
+ else # otherwise, if the two boxes do not intersect
+ outputs.labels << small_label(x, 23.5, 'The boxes do not intersect.')
+ end
+ else
+ outputs.labels << small_label(x, 23.5, '--') # if the two boxes are not defined (are nil or empty), this label is output
+ end
+ end
+
+ # Creates a button and outputs it onto the screen using labels and borders.
+ # If the button is clicked, the color changes to make it look faded.
+ def button_tech_demo
+ x, y, w, h = 460, 160, 300, 50
+ state.button ||= state.new_entity(:button_with_fade)
+
+ # Adds w.half to x and h.half + 10 to y in order to display the text inside the button's borders.
+ state.button.label ||= [x + w.half, y + h.half + 10, "click me and watch me fade", 0, 1]
+ state.button.border ||= [x, y, w, h]
+
+ if inputs.mouse.click && inputs.mouse.click.point.inside_rect?(state.button.border) # if mouse is clicked, and clicked inside button's border
+ state.button.clicked_at = inputs.mouse.click.created_at # stores the time the click occurred
+ end
+
+ outputs.labels << state.button.label
+ outputs.borders << state.button.border
+
+ if state.button.clicked_at # if button was clicked (variable has a value and is not nil)
+
+ # The appearance of the button changes for 0.25 seconds after the time the button is clicked at.
+ # The color changes (rgb is set to 0, 180, 80) and the transparency gradually changes.
+ # Change 0.25 to 1.25 and notice that the transparency takes longer to return to normal.
+ outputs.solids << [x, y, w, h, 0, 180, 80, 255 * state.button.clicked_at.ease(0.25.seconds, :flip)]
+ end
+ end
+
+ # Creates a new button by declaring it as a new entity, and sets values.
+ def new_button_prefab x, y, message
+ w, h = 300, 50
+ button = state.new_entity(:button_with_fade)
+ button.label = [x + w.half, y + h.half + 10, message, 0, 1] # '+ 10' keeps label's text within button's borders
+ button.border = [x, y, w, h] # sets border definition
+ button
+ end
+
+ # If the mouse has been clicked and the click's location is inside of the button's border, that means
+ # that the button has been clicked. This method returns a boolean value.
+ def button_clicked? button
+ inputs.mouse.click && inputs.mouse.click.point.inside_rect?(button.border)
+ end
+
+ # Determines if button was clicked, and changes its appearance if it is clicked
+ def tick_button_prefab button
+ outputs.labels << button.label # outputs button's label and border
+ outputs.borders << button.border
+
+ if button_clicked? button # if button is clicked
+ button.clicked_at = inputs.mouse.click.created_at # stores the time that the button was clicked
+ end
+
+ if button.clicked_at # if clicked_at has a frame value and is not nil
+ # button is output; color changes and transparency changes for 0.25 seconds after click occurs
+ outputs.solids << [button.border.x, button.border.y, button.border.w, button.border.h,
+ 0, 180, 80, 255 * button.clicked_at.ease(0.25.seconds, :flip)] # transparency changes for 0.25 seconds
+ end
+ end
+
+ # Exports the app's game state if the export button is clicked.
+ def export_game_state_demo
+ state.export_game_state_button ||= new_button_prefab(460, 100, "click to export app state")
+ tick_button_prefab(state.export_game_state_button) # calls method to output button
+ if button_clicked? state.export_game_state_button # if the export button is clicked
+ args.gtk.export! "Exported from clicking the export button in the tech demo." # the export occurs
+ end
+ end
+
+ # The mouse and keyboard focus are set to "yes" when the Dragonruby window is the active window.
+ def window_state_demo
+ m = $gtk.args.inputs.mouse.has_focus ? 'Y' : 'N' # ternary operator (similar to if statement)
+ k = $gtk.args.inputs.keyboard.has_focus ? 'Y' : 'N'
+ outputs.labels << [460, 20, "mouse focus: #{m} keyboard focus: #{k}", small_font]
+ end
+
+ #Sets values for the horizontal separator (divides demo sections)
+ def horizontal_seperator y, x, x2
+ [x, y, x2, y, 150, 150, 150]
+ end
+
+ #Sets the values for the vertical separator (divides demo sections)
+ def vertical_seperator x, y, y2
+ [x, y, x, y2, 150, 150, 150]
+ end
+
+ # Outputs vertical and horizontal separators onto the screen to separate each demo section.
+ def render_seperators
+ outputs.lines << horizontal_seperator(505, grid.left, 445)
+ outputs.lines << horizontal_seperator(353, grid.left, 445)
+ outputs.lines << horizontal_seperator(264, grid.left, 445)
+ outputs.lines << horizontal_seperator(174, grid.left, 445)
+
+ outputs.lines << vertical_seperator(445, grid.top, grid.bottom)
+
+ outputs.lines << horizontal_seperator(690, 445, 820)
+ outputs.lines << horizontal_seperator(426, 445, 820)
+
+ outputs.lines << vertical_seperator(820, grid.top, grid.bottom)
+ end
+end
+
+$tech_demo = TechDemo.new
+
+def tick args
+ $tech_demo.inputs = args.inputs
+ $tech_demo.state = args.state
+ $tech_demo.grid = args.grid
+ $tech_demo.args = args
+ $tech_demo.outputs = args.render_target(:mini_map)
+ $tech_demo.tick
+ args.outputs.labels << [830, 715, "Render target:", [-2, 0, 0, 0, 0, 255]]
+ args.outputs.sprites << [0, 0, 1280, 720, :mini_map]
+ args.outputs.sprites << [830, 300, 675, 379, :mini_map]
+ tick_instructions args, "Sample app shows all the rendering apis available."
+end
+
+def tick_instructions args, text, y = 715
+ return if args.state.key_event_occurred
+ if args.inputs.mouse.click ||
+ args.inputs.keyboard.directional_vector ||
+ args.inputs.keyboard.key_down.enter ||
+ args.inputs.keyboard.key_down.escape
+ args.state.key_event_occurred = true
+ end
+
+ args.outputs.debug << [0, y - 50, 1280, 60].solid
+ args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
+ args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
+end
diff --git a/samples/07_advanced_rendering/03_render_target_viewports/license-for-sample.txt b/samples/07_advanced_rendering/03_render_target_viewports/license-for-sample.txt
new file mode 100644
index 0000000..100dcec
--- /dev/null
+++ b/samples/07_advanced_rendering/03_render_target_viewports/license-for-sample.txt
@@ -0,0 +1,9 @@
+Copyright 2019 DragonRuby LLC
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/samples/07_advanced_rendering/03_render_target_viewports/replay.txt b/samples/07_advanced_rendering/03_render_target_viewports/replay.txt
new file mode 100644
index 0000000..523261b
--- /dev/null
+++ b/samples/07_advanced_rendering/03_render_target_viewports/replay.txt
@@ -0,0 +1,1928 @@
+replay_version 2.0
+stopped_at 3543
+seed 100
+recorded_at Sun Sep 29 21:38:13 2019
+[:mouse_move, 610, 140, 2, 1, 44]
+[:mouse_move, 600, 140, 2, 2, 45]
+[:mouse_move, 588, 140, 2, 3, 46]
+[:mouse_move, 549, 140, 2, 4, 47]
+[:mouse_move, 537, 140, 2, 5, 48]
+[:mouse_move, 488, 140, 2, 6, 49]
+[:mouse_move, 468, 140, 2, 7, 50]
+[:mouse_move, 429, 138, 2, 8, 51]
+[:mouse_move, 412, 135, 2, 9, 52]
+[:mouse_move, 360, 127, 2, 10, 53]
+[:mouse_move, 338, 124, 2, 11, 54]
+[:mouse_move, 302, 122, 2, 12, 55]
+[:mouse_move, 281, 121, 2, 13, 56]
+[:mouse_move, 242, 121, 2, 14, 57]
+[:mouse_move, 208, 120, 2, 15, 58]
+[:mouse_move, 178, 117, 2, 16, 59]
+[:mouse_move, 159, 115, 2, 17, 60]
+[:mouse_move, 142, 112, 2, 18, 61]
+[:mouse_move, 112, 102, 2, 19, 62]
+[:mouse_move, 99, 96, 2, 20, 63]
+[:mouse_move, 85, 85, 2, 21, 64]
+[:mouse_move, 82, 83, 2, 22, 65]
+[:mouse_move, 75, 78, 2, 23, 66]
+[:mouse_move, 73, 75, 2, 24, 67]
+[:mouse_move, 72, 75, 2, 25, 79]
+[:mouse_move, 67, 70, 2, 26, 80]
+[:mouse_move, 64, 65, 2, 27, 81]
+[:mouse_move, 57, 56, 2, 28, 82]
+[:mouse_move, 54, 52, 2, 29, 83]
+[:mouse_move, 50, 46, 2, 30, 84]
+[:mouse_move, 47, 43, 2, 31, 85]
+[:mouse_move, 43, 38, 2, 32, 86]
+[:mouse_move, 42, 37, 2, 33, 87]
+[:mouse_move, 41, 36, 2, 34, 88]
+[:mouse_move, 39, 36, 2, 35, 89]
+[:mouse_move, 37, 36, 2, 36, 90]
+[:mouse_move, 35, 36, 2, 37, 91]
+[:mouse_move, 34, 36, 2, 38, 92]
+[:mouse_move, 32, 36, 2, 39, 93]
+[:mouse_move, 31, 36, 2, 40, 94]
+[:mouse_move, 30, 36, 2, 41, 95]
+[:mouse_move, 29, 36, 2, 42, 96]
+[:mouse_move, 28, 36, 2, 43, 97]
+[:mouse_move, 27, 36, 2, 44, 98]
+[:mouse_move, 25, 36, 2, 45, 99]
+[:mouse_move, 22, 35, 2, 46, 101]
+[:mouse_move, 21, 34, 2, 47, 102]
+[:mouse_move, 19, 33, 2, 48, 103]
+[:mouse_move, 18, 32, 2, 49, 104]
+[:mouse_move, 15, 30, 2, 50, 105]
+[:mouse_move, 14, 30, 2, 51, 106]
+[:mouse_move, 12, 29, 2, 52, 107]
+[:mouse_move, 12, 28, 2, 53, 108]
+[:mouse_move, 11, 28, 2, 54, 109]
+[:mouse_move, 11, 27, 2, 55, 124]
+[:mouse_move, 10, 27, 2, 56, 128]
+[:mouse_move, 11, 27, 2, 57, 135]
+[:mouse_move, 19, 28, 2, 58, 136]
+[:mouse_move, 26, 29, 2, 59, 137]
+[:mouse_move, 39, 31, 2, 60, 138]
+[:mouse_move, 45, 31, 2, 61, 139]
+[:mouse_move, 62, 32, 2, 62, 140]
+[:mouse_move, 70, 32, 2, 63, 141]
+[:mouse_move, 78, 32, 2, 64, 142]
+[:mouse_move, 94, 32, 2, 65, 143]
+[:mouse_move, 100, 31, 2, 66, 144]
+[:mouse_move, 112, 30, 2, 67, 145]
+[:mouse_move, 118, 30, 2, 68, 146]
+[:mouse_move, 131, 29, 2, 69, 147]
+[:mouse_move, 141, 29, 2, 70, 148]
+[:mouse_move, 159, 32, 2, 71, 149]
+[:mouse_move, 170, 34, 2, 72, 150]
+[:mouse_move, 186, 40, 2, 73, 151]
+[:mouse_move, 194, 43, 2, 74, 152]
+[:mouse_move, 208, 49, 2, 75, 153]
+[:mouse_move, 214, 51, 2, 76, 154]
+[:mouse_move, 224, 54, 2, 77, 155]
+[:mouse_move, 229, 55, 2, 78, 156]
+[:mouse_move, 236, 56, 2, 79, 157]
+[:mouse_move, 240, 56, 2, 80, 158]
+[:mouse_move, 246, 57, 2, 81, 159]
+[:mouse_move, 249, 57, 2, 82, 160]
+[:mouse_move, 255, 58, 2, 83, 161]
+[:mouse_move, 257, 59, 2, 84, 162]
+[:mouse_move, 261, 61, 2, 85, 163]
+[:mouse_move, 264, 63, 2, 86, 164]
+[:mouse_move, 268, 67, 2, 87, 165]
+[:mouse_move, 271, 71, 2, 88, 166]
+[:mouse_move, 278, 79, 2, 89, 167]
+[:mouse_move, 282, 86, 2, 90, 168]
+[:mouse_move, 288, 99, 2, 91, 169]
+[:mouse_move, 290, 107, 2, 92, 170]
+[:mouse_move, 292, 116, 2, 93, 171]
+[:mouse_move, 295, 138, 2, 94, 172]
+[:mouse_move, 296, 149, 2, 95, 173]
+[:mouse_move, 296, 164, 2, 96, 174]
+[:mouse_move, 296, 168, 2, 97, 175]
+[:mouse_move, 293, 180, 2, 98, 176]
+[:mouse_move, 292, 183, 2, 99, 177]
+[:mouse_move, 291, 188, 2, 100, 178]
+[:mouse_move, 291, 189, 2, 101, 179]
+[:mouse_move, 291, 192, 2, 102, 180]
+[:mouse_move, 293, 193, 2, 103, 181]
+[:mouse_move, 303, 198, 2, 104, 182]
+[:mouse_move, 311, 202, 2, 105, 183]
+[:mouse_move, 332, 211, 2, 106, 184]
+[:mouse_move, 356, 221, 2, 107, 185]
+[:mouse_move, 382, 232, 2, 108, 186]
+[:mouse_move, 397, 237, 2, 109, 187]
+[:mouse_move, 415, 242, 2, 110, 188]
+[:mouse_move, 424, 243, 2, 111, 189]
+[:mouse_move, 438, 243, 2, 112, 190]
+[:mouse_move, 445, 239, 2, 113, 191]
+[:mouse_move, 452, 221, 2, 114, 192]
+[:mouse_move, 454, 208, 2, 115, 193]
+[:mouse_move, 458, 184, 2, 116, 194]
+[:mouse_move, 459, 170, 2, 117, 195]
+[:mouse_move, 461, 147, 2, 118, 196]
+[:mouse_move, 461, 137, 2, 119, 197]
+[:mouse_move, 461, 122, 2, 120, 198]
+[:mouse_move, 461, 103, 2, 121, 199]
+[:mouse_move, 459, 93, 2, 122, 200]
+[:mouse_move, 454, 81, 2, 123, 201]
+[:mouse_move, 451, 73, 2, 124, 202]
+[:mouse_move, 444, 59, 2, 125, 203]
+[:mouse_move, 439, 52, 2, 126, 204]
+[:mouse_move, 427, 35, 2, 127, 205]
+[:mouse_move, 420, 30, 2, 128, 206]
+[:mouse_move, 409, 22, 2, 129, 207]
+[:mouse_move, 402, 18, 2, 130, 208]
+[:mouse_move, 381, 6, 2, 131, 209]
+[:mouse_move, 372, 2, 2, 132, 210]
+[:mouse_move, 334, 0, 2, 133, 211]
+[:mouse_move, 73, 5, 2, 134, 226]
+[:mouse_move, 69, 10, 2, 135, 227]
+[:mouse_move, 61, 21, 2, 136, 228]
+[:mouse_move, 58, 25, 2, 137, 229]
+[:mouse_move, 53, 35, 2, 138, 230]
+[:mouse_move, 51, 40, 2, 139, 231]
+[:mouse_move, 48, 55, 2, 140, 232]
+[:mouse_move, 48, 60, 2, 141, 233]
+[:mouse_move, 47, 77, 2, 142, 234]
+[:mouse_move, 47, 84, 2, 143, 235]
+[:mouse_move, 47, 100, 2, 144, 236]
+[:mouse_move, 47, 108, 2, 145, 237]
+[:mouse_move, 50, 122, 2, 146, 238]
+[:mouse_move, 51, 129, 2, 147, 239]
+[:mouse_move, 57, 150, 2, 148, 240]
+[:mouse_move, 60, 158, 2, 149, 241]
+[:mouse_move, 64, 169, 2, 150, 242]
+[:mouse_move, 65, 172, 2, 151, 243]
+[:mouse_move, 69, 181, 2, 152, 244]
+[:mouse_move, 72, 186, 2, 153, 245]
+[:mouse_move, 81, 194, 2, 154, 246]
+[:mouse_move, 89, 196, 2, 155, 247]
+[:mouse_move, 109, 202, 2, 156, 248]
+[:mouse_move, 122, 206, 2, 157, 249]
+[:mouse_move, 149, 213, 2, 158, 250]
+[:mouse_move, 162, 216, 2, 159, 251]
+[:mouse_move, 176, 218, 2, 160, 252]
+[:mouse_move, 204, 222, 2, 161, 253]
+[:mouse_move, 216, 222, 2, 162, 254]
+[:mouse_move, 242, 224, 2, 163, 255]
+[:mouse_move, 254, 224, 2, 164, 256]
+[:mouse_move, 272, 225, 2, 165, 257]
+[:mouse_move, 282, 225, 2, 166, 258]
+[:mouse_move, 300, 225, 2, 167, 259]
+[:mouse_move, 309, 223, 2, 168, 260]
+[:mouse_move, 323, 220, 2, 169, 261]
+[:mouse_move, 328, 219, 2, 170, 262]
+[:mouse_move, 341, 216, 2, 171, 263]
+[:mouse_move, 347, 214, 2, 172, 264]
+[:mouse_move, 358, 212, 2, 173, 265]
+[:mouse_move, 364, 211, 2, 174, 266]
+[:mouse_move, 373, 209, 2, 175, 267]
+[:mouse_move, 378, 208, 2, 176, 268]
+[:mouse_move, 385, 205, 2, 177, 269]
+[:mouse_move, 388, 204, 2, 178, 270]
+[:mouse_move, 395, 201, 2, 179, 271]
+[:mouse_move, 395, 200, 2, 180, 272]
+[:mouse_move, 399, 197, 2, 181, 273]
+[:mouse_move, 401, 196, 2, 182, 274]
+[:mouse_move, 403, 194, 2, 183, 275]
+[:mouse_move, 404, 192, 2, 184, 276]
+[:mouse_move, 405, 191, 2, 185, 277]
+[:mouse_move, 406, 190, 2, 186, 278]
+[:mouse_move, 406, 189, 2, 187, 279]
+[:mouse_move, 407, 188, 2, 188, 281]
+[:mouse_move, 407, 185, 2, 189, 282]
+[:mouse_move, 407, 184, 2, 190, 283]
+[:mouse_move, 406, 180, 2, 191, 284]
+[:mouse_move, 405, 178, 2, 192, 285]
+[:mouse_move, 404, 177, 2, 193, 285]
+[:mouse_move, 404, 176, 2, 194, 286]
+[:mouse_move, 403, 175, 2, 195, 287]
+[:mouse_move, 402, 174, 2, 196, 288]
+[:mouse_move, 402, 173, 2, 197, 289]
+[:mouse_move, 401, 172, 2, 198, 291]
+[:mouse_move, 396, 171, 2, 199, 309]
+[:mouse_move, 391, 168, 2, 200, 310]
+[:mouse_move, 372, 160, 2, 201, 311]
+[:mouse_move, 359, 156, 2, 202, 312]
+[:mouse_move, 330, 147, 2, 203, 313]
+[:mouse_move, 314, 141, 2, 204, 314]
+[:mouse_move, 280, 129, 2, 205, 315]
+[:mouse_move, 274, 127, 2, 206, 316]
+[:mouse_move, 259, 120, 2, 207, 317]
+[:mouse_move, 252, 117, 2, 208, 318]
+[:mouse_move, 240, 110, 2, 209, 319]
+[:mouse_move, 236, 107, 2, 210, 320]
+[:mouse_move, 233, 104, 2, 211, 321]
+[:mouse_move, 231, 102, 2, 212, 322]
+[:mouse_move, 225, 97, 2, 213, 323]
+[:mouse_move, 223, 96, 2, 214, 324]
+[:mouse_move, 217, 91, 2, 215, 325]
+[:mouse_move, 213, 89, 2, 216, 326]
+[:mouse_move, 209, 86, 2, 217, 327]
+[:mouse_move, 201, 82, 2, 218, 328]
+[:mouse_move, 193, 80, 2, 219, 329]
+[:mouse_move, 188, 78, 2, 220, 330]
+[:mouse_move, 177, 75, 2, 221, 331]
+[:mouse_move, 172, 73, 2, 222, 332]
+[:mouse_move, 167, 72, 2, 223, 333]
+[:mouse_move, 158, 70, 2, 224, 334]
+[:mouse_move, 156, 70, 2, 225, 335]
+[:mouse_move, 147, 67, 2, 226, 336]
+[:mouse_move, 144, 67, 2, 227, 337]
+[:mouse_move, 140, 65, 2, 228, 338]
+[:mouse_move, 138, 65, 2, 229, 339]
+[:mouse_move, 137, 65, 2, 230, 340]
+[:mouse_move, 139, 65, 2, 231, 345]
+[:mouse_move, 148, 70, 2, 232, 346]
+[:mouse_move, 154, 73, 2, 233, 347]
+[:mouse_move, 165, 78, 2, 234, 348]
+[:mouse_move, 172, 82, 2, 235, 349]
+[:mouse_move, 186, 87, 2, 236, 350]
+[:mouse_move, 192, 90, 2, 237, 351]
+[:mouse_move, 204, 94, 2, 238, 352]
+[:mouse_move, 210, 97, 2, 239, 353]
+[:mouse_move, 218, 100, 2, 240, 354]
+[:mouse_move, 222, 101, 2, 241, 355]
+[:mouse_move, 230, 104, 2, 242, 356]
+[:mouse_move, 234, 106, 2, 243, 357]
+[:mouse_move, 241, 108, 2, 244, 358]
+[:mouse_move, 245, 110, 2, 245, 359]
+[:mouse_move, 253, 112, 2, 246, 360]
+[:mouse_move, 257, 114, 2, 247, 361]
+[:mouse_move, 261, 116, 2, 248, 362]
+[:mouse_move, 270, 119, 2, 249, 363]
+[:mouse_move, 274, 120, 2, 250, 364]
+[:mouse_move, 283, 122, 2, 251, 365]
+[:mouse_move, 287, 124, 2, 252, 366]
+[:mouse_move, 296, 127, 2, 253, 367]
+[:mouse_move, 300, 128, 2, 254, 368]
+[:mouse_move, 308, 131, 2, 255, 369]
+[:mouse_move, 312, 132, 2, 256, 370]
+[:mouse_move, 321, 135, 2, 257, 371]
+[:mouse_move, 325, 137, 2, 258, 372]
+[:mouse_move, 333, 142, 2, 259, 373]
+[:mouse_move, 337, 144, 2, 260, 374]
+[:mouse_move, 342, 147, 2, 261, 375]
+[:mouse_move, 344, 148, 2, 262, 376]
+[:mouse_move, 348, 150, 2, 263, 377]
+[:mouse_move, 350, 151, 2, 264, 378]
+[:mouse_move, 352, 152, 2, 265, 379]
+[:mouse_move, 353, 153, 2, 266, 380]
+[:mouse_move, 354, 153, 2, 267, 381]
+[:mouse_move, 355, 153, 2, 268, 384]
+[:mouse_move, 354, 153, 2, 269, 399]
+[:mouse_move, 349, 153, 2, 270, 400]
+[:mouse_move, 346, 153, 2, 271, 401]
+[:mouse_move, 332, 153, 2, 272, 402]
+[:mouse_move, 325, 152, 2, 273, 403]
+[:mouse_move, 304, 148, 2, 274, 404]
+[:mouse_move, 294, 146, 2, 275, 405]
+[:mouse_move, 266, 141, 2, 276, 406]
+[:mouse_move, 260, 140, 2, 277, 407]
+[:mouse_move, 249, 137, 2, 278, 408]
+[:mouse_move, 239, 135, 2, 279, 409]
+[:mouse_move, 230, 133, 2, 280, 410]
+[:mouse_move, 228, 132, 2, 281, 411]
+[:mouse_move, 226, 130, 2, 282, 412]
+[:mouse_move, 226, 129, 2, 283, 415]
+[:mouse_move, 226, 128, 2, 284, 417]
+[:mouse_move, 226, 127, 2, 285, 418]
+[:mouse_move, 226, 124, 2, 286, 419]
+[:mouse_move, 226, 122, 2, 287, 420]
+[:mouse_move, 226, 115, 2, 288, 421]
+[:mouse_move, 225, 112, 2, 289, 422]
+[:mouse_move, 223, 108, 2, 290, 423]
+[:mouse_move, 222, 105, 2, 291, 424]
+[:mouse_move, 220, 102, 2, 292, 425]
+[:mouse_move, 219, 100, 2, 293, 426]
+[:mouse_move, 216, 97, 2, 294, 427]
+[:mouse_move, 215, 96, 2, 295, 428]
+[:mouse_move, 215, 95, 2, 296, 429]
+[:mouse_move, 214, 95, 2, 297, 430]
+[:mouse_move, 214, 96, 2, 298, 435]
+[:mouse_move, 214, 98, 2, 299, 436]
+[:mouse_move, 214, 104, 2, 300, 437]
+[:mouse_move, 214, 106, 2, 301, 438]
+[:mouse_move, 214, 113, 2, 302, 439]
+[:mouse_move, 214, 115, 2, 303, 440]
+[:mouse_move, 215, 121, 2, 304, 441]
+[:mouse_move, 215, 124, 2, 305, 442]
+[:mouse_move, 215, 128, 2, 306, 443]
+[:mouse_move, 215, 132, 2, 307, 444]
+[:mouse_move, 215, 134, 2, 308, 445]
+[:mouse_move, 215, 138, 2, 309, 446]
+[:mouse_move, 215, 139, 2, 310, 447]
+[:mouse_move, 215, 142, 2, 311, 448]
+[:mouse_move, 216, 143, 2, 312, 449]
+[:mouse_move, 216, 144, 2, 313, 450]
+[:mouse_move, 216, 145, 2, 314, 451]
+[:mouse_move, 216, 147, 2, 315, 452]
+[:mouse_move, 216, 148, 2, 316, 453]
+[:mouse_move, 216, 150, 2, 317, 454]
+[:mouse_move, 216, 152, 2, 318, 455]
+[:mouse_move, 216, 155, 2, 319, 456]
+[:mouse_move, 216, 157, 2, 320, 457]
+[:mouse_move, 216, 161, 2, 321, 458]
+[:mouse_move, 216, 163, 2, 322, 459]
+[:mouse_move, 216, 168, 2, 323, 460]
+[:mouse_move, 216, 172, 2, 324, 461]
+[:mouse_move, 214, 177, 2, 325, 462]
+[:mouse_move, 213, 181, 2, 326, 463]
+[:mouse_move, 211, 192, 2, 327, 464]
+[:mouse_move, 211, 195, 2, 328, 465]
+[:mouse_move, 210, 202, 2, 329, 466]
+[:mouse_move, 209, 206, 2, 330, 467]
+[:mouse_move, 209, 209, 2, 331, 468]
+[:mouse_move, 208, 212, 2, 332, 469]
+[:mouse_move, 208, 214, 2, 333, 470]
+[:mouse_move, 208, 215, 2, 334, 471]
+[:mouse_move, 208, 216, 2, 335, 473]
+[:mouse_move, 208, 215, 2, 336, 518]
+[:mouse_move, 203, 213, 2, 337, 520]
+[:mouse_move, 198, 211, 2, 338, 521]
+[:mouse_move, 186, 206, 2, 339, 522]
+[:mouse_move, 178, 201, 2, 340, 523]
+[:mouse_move, 167, 195, 2, 341, 524]
+[:mouse_move, 161, 190, 2, 342, 525]
+[:mouse_move, 154, 185, 2, 343, 526]
+[:mouse_move, 144, 176, 2, 344, 527]
+[:mouse_move, 139, 172, 2, 345, 528]
+[:mouse_move, 132, 162, 2, 346, 529]
+[:mouse_move, 128, 157, 2, 347, 530]
+[:mouse_move, 122, 147, 2, 348, 531]
+[:mouse_move, 121, 144, 2, 349, 532]
+[:mouse_move, 116, 135, 2, 350, 533]
+[:mouse_move, 114, 132, 2, 351, 534]
+[:mouse_move, 110, 124, 2, 352, 535]
+[:mouse_move, 109, 119, 2, 353, 536]
+[:mouse_move, 106, 114, 2, 354, 537]
+[:mouse_move, 104, 110, 2, 355, 538]
+[:mouse_move, 99, 101, 2, 356, 539]
+[:mouse_move, 97, 97, 2, 357, 540]
+[:mouse_move, 80, 79, 2, 358, 541]
+[:mouse_move, 70, 68, 2, 359, 542]
+[:mouse_move, 62, 63, 2, 360, 543]
+[:mouse_move, 51, 57, 2, 361, 544]
+[:mouse_move, 34, 51, 2, 362, 545]
+[:mouse_move, 32, 51, 2, 363, 546]
+[:mouse_move, 23, 51, 2, 364, 547]
+[:mouse_move, 20, 51, 2, 365, 548]
+[:mouse_move, 18, 51, 2, 366, 549]
+[:mouse_move, 15, 53, 2, 367, 550]
+[:mouse_move, 13, 54, 2, 368, 551]
+[:mouse_move, 11, 57, 2, 369, 552]
+[:mouse_move, 10, 58, 2, 370, 553]
+[:mouse_move, 8, 61, 2, 371, 554]
+[:mouse_move, 7, 62, 2, 372, 555]
+[:mouse_move, 6, 64, 2, 373, 556]
+[:mouse_move, 6, 65, 2, 374, 557]
+[:mouse_move, 5, 67, 2, 375, 558]
+[:mouse_move, 5, 68, 2, 376, 559]
+[:mouse_move, 3, 70, 2, 377, 560]
+[:mouse_move, 3, 71, 2, 378, 561]
+[:mouse_move, 1, 74, 2, 379, 562]
+[:mouse_move, 0, 75, 2, 380, 564]
+[:mouse_move, 0, 76, 2, 381, 566]
+[:mouse_move, 1, 76, 2, 382, 570]
+[:mouse_move, 2, 77, 2, 383, 586]
+[:mouse_move, 6, 79, 2, 384, 587]
+[:mouse_move, 8, 81, 2, 385, 588]
+[:mouse_move, 13, 86, 2, 386, 589]
+[:mouse_move, 15, 89, 2, 387, 590]
+[:mouse_move, 21, 96, 2, 388, 591]
+[:mouse_move, 22, 98, 2, 389, 592]
+[:mouse_move, 25, 103, 2, 390, 593]
+[:mouse_move, 26, 105, 2, 391, 594]
+[:mouse_move, 27, 108, 2, 392, 595]
+[:mouse_move, 28, 109, 2, 393, 596]
+[:mouse_move, 28, 110, 2, 394, 597]
+[:mouse_move, 28, 111, 2, 395, 599]
+[:mouse_move, 28, 112, 2, 396, 618]
+[:mouse_move, 28, 113, 2, 397, 619]
+[:mouse_move, 29, 117, 2, 398, 620]
+[:mouse_move, 29, 120, 2, 399, 621]
+[:mouse_move, 30, 125, 2, 400, 622]
+[:mouse_move, 30, 128, 2, 401, 623]
+[:mouse_move, 31, 132, 2, 402, 624]
+[:mouse_move, 31, 133, 2, 403, 625]
+[:mouse_move, 31, 135, 2, 404, 626]
+[:mouse_move, 32, 136, 2, 405, 628]
+[:mouse_move, 32, 137, 2, 406, 630]
+[:mouse_move, 32, 138, 2, 407, 651]
+[:mouse_move, 32, 139, 2, 408, 652]
+[:mouse_move, 32, 144, 2, 409, 653]
+[:mouse_move, 32, 149, 2, 410, 654]
+[:mouse_move, 32, 156, 2, 411, 655]
+[:mouse_move, 32, 158, 2, 412, 656]
+[:mouse_move, 32, 163, 2, 413, 657]
+[:mouse_move, 32, 165, 2, 414, 658]
+[:mouse_move, 32, 166, 2, 415, 659]
+[:mouse_move, 32, 167, 2, 416, 661]
+[:mouse_move, 33, 167, 2, 417, 662]
+[:mouse_move, 33, 170, 2, 418, 680]
+[:mouse_move, 33, 173, 2, 419, 681]
+[:mouse_move, 34, 178, 2, 420, 682]
+[:mouse_move, 34, 181, 2, 421, 683]
+[:mouse_move, 36, 187, 2, 422, 684]
+[:mouse_move, 36, 189, 2, 423, 685]
+[:mouse_move, 36, 191, 2, 424, 686]
+[:mouse_move, 37, 193, 2, 425, 687]
+[:mouse_move, 37, 194, 2, 426, 688]
+[:mouse_move, 38, 194, 2, 427, 689]
+[:mouse_move, 38, 195, 2, 428, 720]
+[:mouse_move, 38, 198, 2, 429, 721]
+[:mouse_move, 36, 203, 2, 430, 722]
+[:mouse_move, 35, 204, 2, 431, 723]
+[:mouse_move, 33, 209, 2, 432, 724]
+[:mouse_move, 32, 211, 2, 433, 725]
+[:mouse_move, 27, 216, 2, 434, 726]
+[:mouse_move, 25, 218, 2, 435, 727]
+[:mouse_move, 20, 223, 2, 436, 728]
+[:mouse_move, 17, 226, 2, 437, 729]
+[:mouse_move, 16, 228, 2, 438, 730]
+[:mouse_move, 12, 232, 2, 439, 731]
+[:mouse_move, 9, 235, 2, 440, 732]
+[:mouse_move, 9, 236, 2, 441, 733]
+[:mouse_move, 8, 238, 2, 442, 734]
+[:mouse_move, 8, 239, 2, 443, 735]
+[:mouse_move, 8, 240, 2, 444, 736]
+[:mouse_move, 8, 241, 2, 445, 737]
+[:mouse_move, 8, 242, 2, 446, 738]
+[:mouse_move, 8, 243, 2, 447, 739]
+[:mouse_move, 8, 244, 2, 448, 740]
+[:mouse_move, 9, 245, 2, 449, 743]
+[:mouse_move, 10, 245, 2, 450, 746]
+[:mouse_move, 15, 246, 2, 451, 747]
+[:mouse_move, 17, 246, 2, 452, 748]
+[:mouse_move, 25, 247, 2, 453, 749]
+[:mouse_move, 29, 247, 2, 454, 750]
+[:mouse_move, 39, 248, 2, 455, 751]
+[:mouse_move, 45, 249, 2, 456, 752]
+[:mouse_move, 57, 250, 2, 457, 753]
+[:mouse_move, 64, 250, 2, 458, 754]
+[:mouse_move, 76, 251, 2, 459, 755]
+[:mouse_move, 82, 252, 2, 460, 756]
+[:mouse_move, 88, 252, 2, 461, 757]
+[:mouse_move, 93, 253, 2, 462, 758]
+[:mouse_move, 103, 254, 2, 463, 759]
+[:mouse_move, 111, 255, 2, 464, 761]
+[:mouse_move, 126, 257, 2, 465, 762]
+[:mouse_move, 138, 258, 2, 466, 763]
+[:mouse_move, 153, 259, 2, 467, 764]
+[:mouse_move, 166, 260, 2, 468, 765]
+[:mouse_move, 172, 260, 2, 469, 766]
+[:mouse_move, 178, 260, 2, 470, 767]
+[:mouse_move, 190, 260, 2, 471, 768]
+[:mouse_move, 196, 260, 2, 472, 769]
+[:mouse_move, 207, 260, 2, 473, 770]
+[:mouse_move, 213, 260, 2, 474, 771]
+[:mouse_move, 224, 259, 2, 475, 772]
+[:mouse_move, 230, 259, 2, 476, 773]
+[:mouse_move, 240, 258, 2, 477, 774]
+[:mouse_move, 246, 258, 2, 478, 775]
+[:mouse_move, 255, 258, 2, 479, 776]
+[:mouse_move, 261, 258, 2, 480, 777]
+[:mouse_move, 273, 258, 2, 481, 778]
+[:mouse_move, 279, 258, 2, 482, 779]
+[:mouse_move, 291, 259, 2, 483, 780]
+[:mouse_move, 297, 259, 2, 484, 781]
+[:mouse_move, 308, 259, 2, 485, 782]
+[:mouse_move, 310, 259, 2, 486, 783]
+[:mouse_move, 322, 258, 2, 487, 784]
+[:mouse_move, 323, 257, 2, 488, 785]
+[:mouse_move, 329, 255, 2, 489, 786]
+[:mouse_move, 331, 255, 2, 490, 787]
+[:mouse_move, 335, 253, 2, 491, 788]
+[:mouse_move, 337, 253, 2, 492, 789]
+[:mouse_move, 340, 252, 2, 493, 790]
+[:mouse_move, 341, 252, 2, 494, 792]
+[:mouse_move, 342, 252, 2, 495, 793]
+[:mouse_move, 341, 252, 2, 496, 810]
+[:mouse_move, 337, 253, 2, 497, 811]
+[:mouse_move, 332, 254, 2, 498, 812]
+[:mouse_move, 318, 257, 2, 499, 813]
+[:mouse_move, 306, 258, 2, 500, 814]
+[:mouse_move, 278, 262, 2, 501, 815]
+[:mouse_move, 270, 262, 2, 502, 816]
+[:mouse_move, 255, 264, 2, 503, 817]
+[:mouse_move, 248, 265, 2, 504, 818]
+[:mouse_move, 238, 266, 2, 505, 819]
+[:mouse_move, 231, 266, 2, 506, 820]
+[:mouse_move, 228, 266, 2, 507, 821]
+[:mouse_move, 219, 267, 2, 508, 822]
+[:mouse_move, 215, 267, 2, 509, 823]
+[:mouse_move, 209, 268, 2, 510, 824]
+[:mouse_move, 203, 268, 2, 511, 825]
+[:mouse_move, 195, 268, 2, 512, 826]
+[:mouse_move, 190, 268, 2, 513, 827]
+[:mouse_move, 180, 268, 2, 514, 828]
+[:mouse_move, 178, 268, 2, 515, 829]
+[:mouse_move, 171, 268, 2, 516, 830]
+[:mouse_move, 168, 268, 2, 517, 831]
+[:mouse_move, 163, 268, 2, 518, 832]
+[:mouse_move, 159, 268, 2, 519, 833]
+[:mouse_move, 151, 268, 2, 520, 834]
+[:mouse_move, 148, 268, 2, 521, 835]
+[:mouse_move, 138, 269, 2, 522, 836]
+[:mouse_move, 134, 270, 2, 523, 837]
+[:mouse_move, 128, 270, 2, 524, 838]
+[:mouse_move, 123, 271, 2, 525, 839]
+[:mouse_move, 115, 272, 2, 526, 840]
+[:mouse_move, 112, 272, 2, 527, 841]
+[:mouse_move, 107, 273, 2, 528, 842]
+[:mouse_move, 104, 273, 2, 529, 843]
+[:mouse_move, 100, 273, 2, 530, 844]
+[:mouse_move, 98, 273, 2, 531, 845]
+[:mouse_move, 96, 273, 2, 532, 846]
+[:mouse_move, 95, 273, 2, 533, 847]
+[:mouse_move, 92, 273, 2, 534, 848]
+[:mouse_move, 91, 273, 2, 535, 849]
+[:mouse_move, 90, 273, 2, 536, 850]
+[:mouse_move, 89, 273, 2, 537, 851]
+[:mouse_move, 88, 273, 2, 538, 852]
+[:mouse_move, 87, 273, 2, 539, 854]
+[:mouse_move, 88, 273, 2, 540, 862]
+[:mouse_move, 89, 273, 2, 541, 863]
+[:mouse_move, 91, 273, 2, 542, 865]
+[:mouse_move, 92, 273, 2, 543, 866]
+[:mouse_move, 93, 273, 2, 544, 867]
+[:mouse_move, 94, 273, 2, 545, 868]
+[:mouse_move, 95, 273, 2, 546, 869]
+[:mouse_move, 96, 273, 2, 547, 870]
+[:mouse_move, 95, 273, 2, 548, 875]
+[:mouse_move, 93, 273, 2, 549, 876]
+[:mouse_move, 92, 273, 2, 550, 877]
+[:mouse_move, 90, 273, 2, 551, 878]
+[:mouse_move, 89, 273, 2, 552, 879]
+[:mouse_move, 88, 273, 2, 553, 880]
+[:mouse_move, 87, 273, 2, 554, 881]
+[:mouse_move, 88, 273, 2, 555, 885]
+[:mouse_move, 90, 273, 2, 556, 886]
+[:mouse_move, 92, 273, 2, 557, 887]
+[:mouse_move, 95, 273, 2, 558, 888]
+[:mouse_move, 96, 273, 2, 559, 889]
+[:mouse_move, 98, 273, 2, 560, 890]
+[:mouse_move, 99, 272, 2, 561, 892]
+[:mouse_move, 98, 272, 2, 562, 894]
+[:mouse_move, 97, 272, 2, 563, 895]
+[:mouse_move, 93, 272, 2, 564, 896]
+[:mouse_move, 92, 272, 2, 565, 897]
+[:mouse_move, 89, 272, 2, 566, 898]
+[:mouse_move, 88, 273, 2, 567, 900]
+[:mouse_move, 87, 273, 2, 568, 901]
+[:mouse_move, 88, 273, 2, 569, 904]
+[:mouse_move, 90, 273, 2, 570, 905]
+[:mouse_move, 91, 273, 2, 571, 907]
+[:mouse_move, 92, 273, 2, 572, 909]
+[:mouse_move, 89, 273, 2, 573, 927]
+[:mouse_move, 88, 275, 2, 574, 929]
+[:mouse_move, 81, 277, 2, 575, 930]
+[:mouse_move, 77, 279, 2, 576, 931]
+[:mouse_move, 66, 282, 2, 577, 932]
+[:mouse_move, 61, 283, 2, 578, 933]
+[:mouse_move, 55, 284, 2, 579, 934]
+[:mouse_move, 52, 286, 2, 580, 935]
+[:mouse_move, 47, 288, 2, 581, 936]
+[:mouse_move, 44, 290, 2, 582, 937]
+[:mouse_move, 40, 292, 2, 583, 938]
+[:mouse_move, 39, 294, 2, 584, 939]
+[:mouse_move, 36, 296, 2, 585, 940]
+[:mouse_move, 35, 297, 2, 586, 941]
+[:mouse_move, 34, 298, 2, 587, 942]
+[:mouse_move, 33, 299, 2, 588, 943]
+[:mouse_move, 34, 299, 2, 589, 949]
+[:mouse_move, 36, 299, 2, 590, 950]
+[:mouse_move, 52, 297, 2, 591, 951]
+[:mouse_move, 64, 296, 2, 592, 952]
+[:mouse_move, 101, 293, 2, 593, 953]
+[:mouse_move, 135, 292, 2, 594, 954]
+[:mouse_move, 153, 292, 2, 595, 955]
+[:mouse_move, 177, 292, 2, 596, 956]
+[:mouse_move, 190, 292, 2, 597, 957]
+[:mouse_move, 220, 292, 2, 598, 958]
+[:mouse_move, 225, 292, 2, 599, 959]
+[:mouse_move, 233, 292, 2, 600, 960]
+[:mouse_move, 248, 292, 2, 601, 961]
+[:mouse_move, 254, 292, 2, 602, 962]
+[:mouse_move, 261, 292, 2, 603, 963]
+[:mouse_move, 264, 292, 2, 604, 964]
+[:mouse_move, 270, 292, 2, 605, 965]
+[:mouse_move, 272, 292, 2, 606, 966]
+[:mouse_move, 274, 292, 2, 607, 967]
+[:mouse_move, 275, 292, 2, 608, 968]
+[:mouse_move, 276, 292, 2, 609, 969]
+[:mouse_move, 278, 292, 2, 610, 970]
+[:mouse_move, 280, 292, 2, 611, 971]
+[:mouse_move, 281, 292, 2, 612, 972]
+[:mouse_move, 283, 292, 2, 613, 973]
+[:mouse_move, 284, 292, 2, 614, 974]
+[:mouse_move, 286, 292, 2, 615, 975]
+[:mouse_move, 287, 292, 2, 616, 976]
+[:mouse_move, 288, 292, 2, 617, 978]
+[:mouse_move, 285, 292, 2, 618, 982]
+[:mouse_move, 273, 292, 2, 619, 983]
+[:mouse_move, 256, 292, 2, 620, 984]
+[:mouse_move, 246, 292, 2, 621, 985]
+[:mouse_move, 214, 292, 2, 622, 986]
+[:mouse_move, 197, 294, 2, 623, 987]
+[:mouse_move, 164, 299, 2, 624, 988]
+[:mouse_move, 148, 302, 2, 625, 989]
+[:mouse_move, 118, 307, 2, 626, 990]
+[:mouse_move, 112, 309, 2, 627, 991]
+[:mouse_move, 92, 313, 2, 628, 992]
+[:mouse_move, 89, 313, 2, 629, 993]
+[:mouse_move, 75, 316, 2, 630, 994]
+[:mouse_move, 67, 317, 2, 631, 995]
+[:mouse_move, 58, 319, 2, 632, 996]
+[:mouse_move, 54, 319, 2, 633, 997]
+[:mouse_move, 45, 320, 2, 634, 998]
+[:mouse_move, 41, 320, 2, 635, 999]
+[:mouse_move, 35, 321, 2, 636, 1000]
+[:mouse_move, 32, 321, 2, 637, 1001]
+[:mouse_move, 28, 321, 2, 638, 1002]
+[:mouse_move, 27, 321, 2, 639, 1003]
+[:mouse_move, 26, 321, 2, 640, 1004]
+[:mouse_move, 25, 321, 2, 641, 1005]
+[:mouse_move, 25, 320, 2, 642, 1007]
+[:mouse_move, 30, 319, 2, 643, 1008]
+[:mouse_move, 35, 318, 2, 644, 1009]
+[:mouse_move, 42, 316, 2, 645, 1010]
+[:mouse_move, 75, 312, 2, 646, 1011]
+[:mouse_move, 105, 309, 2, 647, 1012]
+[:mouse_move, 123, 308, 2, 648, 1013]
+[:mouse_move, 159, 307, 2, 649, 1015]
+[:mouse_move, 169, 307, 2, 650, 1016]
+[:mouse_move, 188, 307, 2, 651, 1017]
+[:mouse_move, 195, 307, 2, 652, 1018]
+[:mouse_move, 208, 307, 2, 653, 1019]
+[:mouse_move, 214, 307, 2, 654, 1020]
+[:mouse_move, 226, 307, 2, 655, 1021]
+[:mouse_move, 232, 307, 2, 656, 1022]
+[:mouse_move, 244, 307, 2, 657, 1023]
+[:mouse_move, 249, 307, 2, 658, 1024]
+[:mouse_move, 260, 307, 2, 659, 1025]
+[:mouse_move, 262, 307, 2, 660, 1026]
+[:mouse_move, 271, 307, 2, 661, 1027]
+[:mouse_move, 274, 306, 2, 662, 1028]
+[:mouse_move, 279, 306, 2, 663, 1029]
+[:mouse_move, 281, 306, 2, 664, 1030]
+[:mouse_move, 282, 306, 2, 665, 1031]
+[:mouse_move, 283, 306, 2, 666, 1032]
+[:mouse_move, 284, 306, 2, 667, 1034]
+[:mouse_move, 283, 306, 2, 668, 1042]
+[:mouse_move, 280, 306, 2, 669, 1043]
+[:mouse_move, 267, 306, 2, 670, 1044]
+[:mouse_move, 257, 306, 2, 671, 1045]
+[:mouse_move, 222, 310, 2, 672, 1046]
+[:mouse_move, 204, 313, 2, 673, 1047]
+[:mouse_move, 167, 321, 2, 674, 1048]
+[:mouse_move, 150, 325, 2, 675, 1049]
+[:mouse_move, 127, 331, 2, 676, 1050]
+[:mouse_move, 116, 335, 2, 677, 1051]
+[:mouse_move, 99, 340, 2, 678, 1052]
+[:mouse_move, 96, 340, 2, 679, 1053]
+[:mouse_move, 82, 345, 2, 680, 1054]
+[:mouse_move, 78, 346, 2, 681, 1055]
+[:mouse_move, 71, 348, 2, 682, 1056]
+[:mouse_move, 67, 349, 2, 683, 1057]
+[:mouse_move, 59, 352, 2, 684, 1058]
+[:mouse_move, 55, 352, 2, 685, 1059]
+[:mouse_move, 49, 354, 2, 686, 1060]
+[:mouse_move, 46, 354, 2, 687, 1061]
+[:mouse_move, 41, 355, 2, 688, 1062]
+[:mouse_move, 39, 355, 2, 689, 1063]
+[:mouse_move, 31, 355, 2, 690, 1064]
+[:mouse_move, 29, 356, 2, 691, 1065]
+[:mouse_move, 26, 356, 2, 692, 1066]
+[:mouse_move, 21, 356, 2, 693, 1067]
+[:mouse_move, 18, 357, 2, 694, 1068]
+[:mouse_move, 14, 357, 2, 695, 1069]
+[:mouse_move, 13, 357, 2, 696, 1070]
+[:mouse_move, 11, 357, 2, 697, 1071]
+[:mouse_move, 10, 357, 2, 698, 1072]
+[:mouse_move, 17, 356, 2, 699, 1077]
+[:mouse_move, 23, 355, 2, 700, 1078]
+[:mouse_move, 42, 351, 2, 701, 1079]
+[:mouse_move, 47, 350, 2, 702, 1080]
+[:mouse_move, 67, 346, 2, 703, 1081]
+[:mouse_move, 76, 344, 2, 704, 1082]
+[:mouse_move, 92, 341, 2, 705, 1083]
+[:mouse_move, 100, 340, 2, 706, 1084]
+[:mouse_move, 115, 339, 2, 707, 1085]
+[:mouse_move, 123, 338, 2, 708, 1086]
+[:mouse_move, 137, 337, 2, 709, 1087]
+[:mouse_move, 144, 337, 2, 710, 1088]
+[:mouse_move, 157, 336, 2, 711, 1089]
+[:mouse_move, 163, 335, 2, 712, 1090]
+[:mouse_move, 178, 333, 2, 713, 1091]
+[:mouse_move, 182, 332, 2, 714, 1092]
+[:mouse_move, 196, 330, 2, 715, 1093]
+[:mouse_move, 203, 329, 2, 716, 1094]
+[:mouse_move, 210, 328, 2, 717, 1095]
+[:mouse_move, 222, 327, 2, 718, 1096]
+[:mouse_move, 227, 326, 2, 719, 1097]
+[:mouse_move, 237, 324, 2, 720, 1098]
+[:mouse_move, 240, 324, 2, 721, 1099]
+[:mouse_move, 246, 324, 2, 722, 1100]
+[:mouse_move, 249, 324, 2, 723, 1101]
+[:mouse_move, 252, 324, 2, 724, 1102]
+[:mouse_move, 254, 324, 2, 725, 1103]
+[:mouse_move, 256, 324, 2, 726, 1104]
+[:mouse_move, 258, 324, 2, 727, 1105]
+[:mouse_move, 261, 325, 2, 728, 1106]
+[:mouse_move, 263, 325, 2, 729, 1107]
+[:mouse_move, 266, 326, 2, 730, 1108]
+[:mouse_move, 269, 327, 2, 731, 1109]
+[:mouse_move, 275, 328, 2, 732, 1110]
+[:mouse_move, 278, 329, 2, 733, 1111]
+[:mouse_move, 283, 330, 2, 734, 1112]
+[:mouse_move, 286, 332, 2, 735, 1113]
+[:mouse_move, 291, 333, 2, 736, 1114]
+[:mouse_move, 293, 334, 2, 737, 1115]
+[:mouse_move, 297, 334, 2, 738, 1116]
+[:mouse_move, 298, 334, 2, 739, 1117]
+[:mouse_move, 300, 334, 2, 740, 1118]
+[:mouse_move, 301, 334, 2, 741, 1119]
+[:mouse_move, 302, 334, 2, 742, 1121]
+[:mouse_move, 301, 334, 2, 743, 1135]
+[:mouse_move, 301, 335, 2, 744, 1136]
+[:mouse_move, 299, 335, 2, 745, 1137]
+[:mouse_move, 297, 336, 2, 746, 1138]
+[:mouse_move, 286, 340, 2, 747, 1139]
+[:mouse_move, 278, 342, 2, 748, 1140]
+[:mouse_move, 256, 350, 2, 749, 1141]
+[:mouse_move, 244, 353, 2, 750, 1142]
+[:mouse_move, 220, 361, 2, 751, 1143]
+[:mouse_move, 215, 361, 2, 752, 1144]
+[:mouse_move, 194, 364, 2, 753, 1145]
+[:mouse_move, 186, 366, 2, 754, 1146]
+[:mouse_move, 169, 367, 2, 755, 1147]
+[:mouse_move, 163, 367, 2, 756, 1148]
+[:mouse_move, 160, 367, 2, 757, 1149]
+[:mouse_move, 151, 368, 2, 758, 1150]
+[:mouse_move, 147, 368, 2, 759, 1151]
+[:mouse_move, 142, 368, 2, 760, 1152]
+[:mouse_move, 140, 368, 2, 761, 1153]
+[:mouse_move, 137, 369, 2, 762, 1154]
+[:mouse_move, 136, 369, 2, 763, 1156]
+[:mouse_move, 139, 369, 2, 764, 1160]
+[:mouse_move, 144, 368, 2, 765, 1161]
+[:mouse_move, 154, 368, 2, 766, 1162]
+[:mouse_move, 161, 368, 2, 767, 1163]
+[:mouse_move, 174, 367, 2, 768, 1164]
+[:mouse_move, 177, 366, 2, 769, 1165]
+[:mouse_move, 190, 366, 2, 770, 1166]
+[:mouse_move, 193, 366, 2, 771, 1167]
+[:mouse_move, 201, 366, 2, 772, 1168]
+[:mouse_move, 205, 366, 2, 773, 1169]
+[:mouse_move, 210, 366, 2, 774, 1170]
+[:mouse_move, 213, 366, 2, 775, 1171]
+[:mouse_move, 219, 366, 2, 776, 1172]
+[:mouse_move, 222, 366, 2, 777, 1173]
+[:mouse_move, 228, 366, 2, 778, 1174]
+[:mouse_move, 231, 366, 2, 779, 1175]
+[:mouse_move, 234, 366, 2, 780, 1176]
+[:mouse_move, 242, 366, 2, 781, 1177]
+[:mouse_move, 245, 366, 2, 782, 1178]
+[:mouse_move, 253, 367, 2, 783, 1179]
+[:mouse_move, 257, 367, 2, 784, 1180]
+[:mouse_move, 262, 367, 2, 785, 1181]
+[:mouse_move, 265, 367, 2, 786, 1182]
+[:mouse_move, 269, 367, 2, 787, 1183]
+[:mouse_move, 271, 367, 2, 788, 1184]
+[:mouse_move, 274, 368, 2, 789, 1185]
+[:mouse_move, 275, 368, 2, 790, 1187]
+[:mouse_move, 274, 368, 2, 791, 1255]
+[:mouse_move, 270, 369, 2, 792, 1256]
+[:mouse_move, 265, 371, 2, 793, 1257]
+[:mouse_move, 239, 380, 2, 794, 1258]
+[:mouse_move, 231, 383, 2, 795, 1259]
+[:mouse_move, 199, 391, 2, 796, 1260]
+[:mouse_move, 181, 395, 2, 797, 1261]
+[:mouse_move, 146, 400, 2, 798, 1262]
+[:mouse_move, 129, 401, 2, 799, 1263]
+[:mouse_move, 112, 401, 2, 800, 1264]
+[:mouse_move, 109, 401, 2, 801, 1265]
+[:mouse_move, 98, 401, 2, 802, 1266]
+[:mouse_move, 95, 401, 2, 803, 1267]
+[:mouse_move, 90, 401, 2, 804, 1268]
+[:mouse_move, 87, 401, 2, 805, 1269]
+[:mouse_move, 83, 402, 2, 806, 1270]
+[:mouse_move, 80, 403, 2, 807, 1271]
+[:mouse_move, 73, 405, 2, 808, 1272]
+[:mouse_move, 71, 405, 2, 809, 1273]
+[:mouse_move, 63, 408, 2, 810, 1274]
+[:mouse_move, 59, 410, 2, 811, 1275]
+[:mouse_move, 52, 412, 2, 812, 1276]
+[:mouse_move, 50, 412, 2, 813, 1277]
+[:mouse_move, 45, 413, 2, 814, 1278]
+[:mouse_move, 44, 414, 2, 815, 1279]
+[:mouse_move, 41, 414, 2, 816, 1280]
+[:mouse_move, 40, 414, 2, 817, 1283]
+[:mouse_move, 41, 414, 2, 818, 1289]
+[:mouse_move, 41, 415, 2, 819, 1290]
+[:mouse_move, 45, 416, 2, 820, 1291]
+[:mouse_move, 48, 416, 2, 821, 1292]
+[:mouse_move, 56, 417, 2, 822, 1293]
+[:mouse_move, 61, 418, 2, 823, 1294]
+[:mouse_move, 69, 419, 2, 824, 1295]
+[:mouse_move, 71, 419, 2, 825, 1296]
+[:mouse_move, 78, 420, 2, 826, 1297]
+[:mouse_move, 80, 420, 2, 827, 1298]
+[:mouse_move, 83, 420, 2, 828, 1299]
+[:mouse_move, 84, 420, 2, 829, 1301]
+[:mouse_move, 85, 420, 2, 830, 1302]
+[:mouse_move, 86, 420, 2, 831, 1308]
+[:mouse_move, 87, 420, 2, 832, 1310]
+[:mouse_move, 88, 421, 2, 833, 1311]
+[:mouse_move, 92, 422, 2, 834, 1312]
+[:mouse_move, 95, 423, 2, 835, 1313]
+[:mouse_move, 101, 425, 2, 836, 1314]
+[:mouse_move, 105, 425, 2, 837, 1315]
+[:mouse_move, 114, 427, 2, 838, 1316]
+[:mouse_move, 119, 427, 2, 839, 1317]
+[:mouse_move, 125, 427, 2, 840, 1318]
+[:mouse_move, 128, 427, 2, 841, 1319]
+[:mouse_move, 132, 427, 2, 842, 1320]
+[:mouse_move, 133, 427, 2, 843, 1321]
+[:mouse_move, 134, 427, 2, 844, 1322]
+[:mouse_move, 135, 426, 2, 845, 1323]
+[:mouse_move, 136, 425, 2, 846, 1326]
+[:mouse_move, 137, 426, 2, 847, 1332]
+[:mouse_move, 139, 427, 2, 848, 1333]
+[:mouse_move, 145, 432, 2, 849, 1334]
+[:mouse_move, 149, 435, 2, 850, 1335]
+[:mouse_move, 158, 439, 2, 851, 1336]
+[:mouse_move, 162, 440, 2, 852, 1337]
+[:mouse_move, 173, 441, 2, 853, 1338]
+[:mouse_move, 176, 441, 2, 854, 1339]
+[:mouse_move, 185, 435, 2, 855, 1341]
+[:mouse_move, 186, 433, 2, 856, 1342]
+[:mouse_move, 189, 429, 2, 857, 1343]
+[:mouse_move, 190, 428, 2, 858, 1344]
+[:mouse_move, 191, 426, 2, 859, 1345]
+[:mouse_move, 191, 425, 2, 860, 1346]
+[:mouse_move, 192, 425, 2, 861, 1351]
+[:mouse_move, 193, 425, 2, 862, 1354]
+[:mouse_move, 196, 428, 2, 863, 1355]
+[:mouse_move, 198, 429, 2, 864, 1356]
+[:mouse_move, 202, 431, 2, 865, 1357]
+[:mouse_move, 205, 432, 2, 866, 1358]
+[:mouse_move, 209, 432, 2, 867, 1359]
+[:mouse_move, 211, 432, 2, 868, 1360]
+[:mouse_move, 214, 431, 2, 869, 1361]
+[:mouse_move, 216, 430, 2, 870, 1362]
+[:mouse_move, 218, 428, 2, 871, 1363]
+[:mouse_move, 219, 426, 2, 872, 1364]
+[:mouse_move, 220, 425, 2, 873, 1365]
+[:mouse_move, 220, 424, 2, 874, 1366]
+[:mouse_move, 221, 423, 2, 875, 1368]
+[:mouse_move, 222, 424, 2, 876, 1374]
+[:mouse_move, 224, 425, 2, 877, 1375]
+[:mouse_move, 230, 429, 2, 878, 1376]
+[:mouse_move, 234, 431, 2, 879, 1377]
+[:mouse_move, 247, 437, 2, 880, 1378]
+[:mouse_move, 254, 439, 2, 881, 1379]
+[:mouse_move, 266, 440, 2, 882, 1380]
+[:mouse_move, 271, 440, 2, 883, 1381]
+[:mouse_move, 279, 437, 2, 884, 1382]
+[:mouse_move, 282, 435, 2, 885, 1383]
+[:mouse_move, 284, 432, 2, 886, 1384]
+[:mouse_move, 285, 430, 2, 887, 1385]
+[:mouse_move, 285, 429, 2, 888, 1386]
+[:mouse_move, 285, 428, 2, 889, 1387]
+[:mouse_move, 285, 427, 2, 890, 1388]
+[:mouse_move, 285, 428, 2, 891, 1424]
+[:mouse_move, 286, 433, 2, 892, 1425]
+[:mouse_move, 289, 439, 2, 893, 1426]
+[:mouse_move, 291, 442, 2, 894, 1427]
+[:mouse_move, 295, 448, 2, 895, 1428]
+[:mouse_move, 297, 450, 2, 896, 1429]
+[:mouse_move, 304, 453, 2, 897, 1430]
+[:mouse_move, 308, 454, 2, 898, 1431]
+[:mouse_move, 316, 453, 2, 899, 1432]
+[:mouse_move, 320, 450, 2, 900, 1433]
+[:mouse_move, 327, 443, 2, 901, 1434]
+[:mouse_move, 330, 438, 2, 902, 1435]
+[:mouse_move, 332, 432, 2, 903, 1436]
+[:mouse_move, 333, 425, 2, 904, 1437]
+[:mouse_move, 333, 420, 2, 905, 1438]
+[:mouse_move, 332, 418, 2, 906, 1439]
+[:mouse_move, 330, 414, 2, 907, 1440]
+[:mouse_move, 328, 412, 2, 908, 1441]
+[:mouse_move, 325, 409, 2, 909, 1442]
+[:mouse_move, 319, 406, 2, 910, 1443]
+[:mouse_move, 312, 405, 2, 911, 1444]
+[:mouse_move, 308, 404, 2, 912, 1445]
+[:mouse_move, 305, 404, 2, 913, 1446]
+[:mouse_move, 300, 403, 2, 914, 1447]
+[:mouse_move, 296, 403, 2, 915, 1448]
+[:mouse_move, 289, 403, 2, 916, 1449]
+[:mouse_move, 285, 403, 2, 917, 1450]
+[:mouse_move, 279, 404, 2, 918, 1451]
+[:mouse_move, 276, 405, 2, 919, 1452]
+[:mouse_move, 270, 407, 2, 920, 1453]
+[:mouse_move, 268, 409, 2, 921, 1454]
+[:mouse_move, 265, 411, 2, 922, 1455]
+[:mouse_move, 262, 413, 2, 923, 1456]
+[:mouse_move, 259, 417, 2, 924, 1457]
+[:mouse_move, 259, 419, 2, 925, 1458]
+[:mouse_move, 257, 422, 2, 926, 1459]
+[:mouse_move, 256, 424, 2, 927, 1460]
+[:mouse_move, 256, 427, 2, 928, 1461]
+[:mouse_move, 256, 428, 2, 929, 1462]
+[:mouse_move, 256, 430, 2, 930, 1463]
+[:mouse_move, 256, 432, 2, 931, 1464]
+[:mouse_move, 257, 435, 2, 932, 1465]
+[:mouse_move, 258, 436, 2, 933, 1466]
+[:mouse_move, 261, 438, 2, 934, 1467]
+[:mouse_move, 262, 439, 2, 935, 1468]
+[:mouse_move, 265, 442, 2, 936, 1469]
+[:mouse_move, 270, 443, 2, 937, 1470]
+[:mouse_move, 273, 445, 2, 938, 1471]
+[:mouse_move, 277, 446, 2, 939, 1472]
+[:mouse_move, 285, 447, 2, 940, 1473]
+[:mouse_move, 290, 447, 2, 941, 1474]
+[:mouse_move, 298, 447, 2, 942, 1476]
+[:mouse_move, 300, 446, 2, 943, 1478]
+[:mouse_move, 301, 445, 2, 944, 1479]
+[:mouse_move, 301, 444, 2, 945, 1480]
+[:mouse_move, 302, 443, 2, 946, 1481]
+[:mouse_move, 303, 444, 2, 947, 1539]
+[:mouse_move, 304, 450, 2, 948, 1540]
+[:mouse_move, 305, 455, 2, 949, 1541]
+[:mouse_move, 307, 465, 2, 950, 1542]
+[:mouse_move, 308, 471, 2, 951, 1543]
+[:mouse_move, 310, 486, 2, 952, 1544]
+[:mouse_move, 311, 512, 2, 953, 1546]
+[:mouse_move, 311, 529, 2, 954, 1547]
+[:mouse_move, 310, 538, 2, 955, 1548]
+[:mouse_move, 307, 546, 2, 956, 1549]
+[:mouse_move, 305, 553, 2, 957, 1550]
+[:mouse_move, 301, 561, 2, 958, 1551]
+[:mouse_move, 294, 573, 2, 959, 1553]
+[:mouse_move, 280, 588, 2, 960, 1554]
+[:mouse_move, 269, 596, 2, 961, 1555]
+[:mouse_move, 264, 599, 2, 962, 1556]
+[:mouse_move, 258, 602, 2, 963, 1557]
+[:mouse_move, 239, 608, 2, 964, 1558]
+[:mouse_move, 221, 612, 2, 965, 1559]
+[:mouse_move, 211, 613, 2, 966, 1560]
+[:mouse_move, 191, 615, 2, 967, 1561]
+[:mouse_move, 179, 617, 2, 968, 1562]
+[:mouse_move, 162, 618, 2, 969, 1563]
+[:mouse_move, 152, 619, 2, 970, 1564]
+[:mouse_move, 133, 622, 2, 971, 1565]
+[:mouse_move, 124, 624, 2, 972, 1566]
+[:mouse_move, 109, 628, 2, 973, 1567]
+[:mouse_move, 97, 632, 2, 974, 1568]
+[:mouse_move, 92, 634, 2, 975, 1569]
+[:mouse_move, 87, 635, 2, 976, 1570]
+[:mouse_move, 79, 638, 2, 977, 1571]
+[:mouse_move, 71, 640, 2, 978, 1572]
+[:mouse_move, 67, 641, 2, 979, 1573]
+[:mouse_move, 64, 642, 2, 980, 1574]
+[:mouse_move, 59, 642, 2, 981, 1575]
+[:mouse_move, 56, 643, 2, 982, 1576]
+[:mouse_move, 53, 644, 2, 983, 1577]
+[:mouse_move, 51, 644, 2, 984, 1578]
+[:mouse_move, 50, 644, 2, 985, 1579]
+[:mouse_move, 51, 644, 2, 986, 1582]
+[:mouse_move, 53, 645, 2, 987, 1583]
+[:mouse_move, 54, 645, 2, 988, 1584]
+[:mouse_move, 57, 645, 2, 989, 1585]
+[:mouse_move, 64, 647, 2, 990, 1586]
+[:mouse_move, 68, 647, 2, 991, 1587]
+[:mouse_move, 78, 648, 2, 992, 1588]
+[:mouse_move, 84, 648, 2, 993, 1589]
+[:mouse_move, 87, 649, 2, 994, 1590]
+[:mouse_move, 90, 649, 2, 995, 1591]
+[:mouse_move, 98, 649, 2, 996, 1592]
+[:mouse_move, 100, 649, 2, 997, 1593]
+[:mouse_move, 107, 650, 2, 998, 1594]
+[:mouse_move, 110, 650, 2, 999, 1595]
+[:mouse_move, 114, 650, 2, 1000, 1596]
+[:mouse_move, 116, 650, 2, 1001, 1597]
+[:mouse_move, 121, 650, 2, 1002, 1598]
+[:mouse_move, 124, 650, 2, 1003, 1599]
+[:mouse_move, 130, 650, 2, 1004, 1600]
+[:mouse_move, 134, 650, 2, 1005, 1601]
+[:mouse_move, 141, 650, 2, 1006, 1602]
+[:mouse_move, 143, 650, 2, 1007, 1603]
+[:mouse_move, 149, 649, 2, 1008, 1604]
+[:mouse_move, 155, 649, 2, 1009, 1605]
+[:mouse_move, 162, 648, 2, 1010, 1606]
+[:mouse_move, 166, 648, 2, 1011, 1607]
+[:mouse_move, 172, 647, 2, 1012, 1608]
+[:mouse_move, 175, 647, 2, 1013, 1609]
+[:mouse_move, 178, 647, 2, 1014, 1610]
+[:mouse_move, 187, 646, 2, 1015, 1611]
+[:mouse_move, 195, 646, 2, 1016, 1613]
+[:mouse_move, 198, 646, 2, 1017, 1614]
+[:mouse_move, 203, 646, 2, 1018, 1615]
+[:mouse_move, 209, 646, 2, 1019, 1616]
+[:mouse_move, 212, 646, 2, 1020, 1617]
+[:mouse_move, 215, 646, 2, 1021, 1618]
+[:mouse_move, 220, 646, 2, 1022, 1619]
+[:mouse_move, 224, 646, 2, 1023, 1620]
+[:mouse_move, 230, 646, 2, 1024, 1621]
+[:mouse_move, 233, 646, 2, 1025, 1622]
+[:mouse_move, 238, 646, 2, 1026, 1623]
+[:mouse_move, 242, 646, 2, 1027, 1624]
+[:mouse_move, 248, 646, 2, 1028, 1625]
+[:mouse_move, 253, 646, 2, 1029, 1626]
+[:mouse_move, 258, 646, 2, 1030, 1627]
+[:mouse_move, 262, 646, 2, 1031, 1628]
+[:mouse_move, 269, 647, 2, 1032, 1629]
+[:mouse_move, 277, 648, 2, 1033, 1630]
+[:mouse_move, 281, 648, 2, 1034, 1631]
+[:mouse_move, 285, 649, 2, 1035, 1632]
+[:mouse_move, 295, 650, 2, 1036, 1633]
+[:mouse_move, 300, 650, 2, 1037, 1634]
+[:mouse_move, 313, 650, 2, 1038, 1635]
+[:mouse_move, 326, 650, 2, 1039, 1636]
+[:mouse_move, 332, 650, 2, 1040, 1637]
+[:mouse_move, 338, 650, 2, 1041, 1638]
+[:mouse_move, 343, 650, 2, 1042, 1639]
+[:mouse_move, 354, 650, 2, 1043, 1640]
+[:mouse_move, 356, 650, 2, 1044, 1641]
+[:mouse_move, 362, 650, 2, 1045, 1642]
+[:mouse_move, 364, 650, 2, 1046, 1643]
+[:mouse_move, 368, 650, 2, 1047, 1644]
+[:mouse_move, 369, 650, 2, 1048, 1645]
+[:mouse_move, 370, 650, 2, 1049, 1648]
+[:mouse_move, 370, 649, 2, 1050, 1668]
+[:mouse_move, 370, 648, 2, 1051, 1669]
+[:mouse_move, 370, 647, 2, 1052, 1670]
+[:mouse_move, 370, 644, 2, 1053, 1671]
+[:mouse_move, 371, 641, 2, 1054, 1672]
+[:mouse_move, 378, 627, 2, 1055, 1673]
+[:mouse_move, 386, 613, 2, 1056, 1674]
+[:mouse_move, 394, 599, 2, 1057, 1675]
+[:mouse_move, 400, 589, 2, 1058, 1676]
+[:mouse_move, 411, 567, 2, 1059, 1677]
+[:mouse_move, 416, 558, 2, 1060, 1678]
+[:mouse_move, 427, 537, 2, 1061, 1679]
+[:mouse_move, 437, 513, 2, 1062, 1680]
+[:mouse_move, 439, 507, 2, 1063, 1681]
+[:mouse_move, 445, 496, 2, 1064, 1682]
+[:mouse_move, 460, 470, 2, 1065, 1683]
+[:mouse_move, 466, 463, 2, 1066, 1684]
+[:mouse_move, 482, 445, 2, 1067, 1685]
+[:mouse_move, 489, 436, 2, 1068, 1686]
+[:mouse_move, 502, 416, 2, 1069, 1687]
+[:mouse_move, 507, 405, 2, 1070, 1688]
+[:mouse_move, 515, 379, 2, 1071, 1689]
+[:mouse_move, 518, 364, 2, 1072, 1690]
+[:mouse_move, 526, 334, 2, 1073, 1691]
+[:mouse_move, 533, 305, 2, 1074, 1692]
+[:mouse_move, 536, 291, 2, 1075, 1693]
+[:mouse_move, 540, 276, 2, 1076, 1694]
+[:mouse_move, 546, 245, 2, 1077, 1695]
+[:mouse_move, 549, 230, 2, 1078, 1696]
+[:mouse_move, 551, 211, 2, 1079, 1697]
+[:mouse_move, 553, 201, 2, 1080, 1698]
+[:mouse_move, 554, 191, 2, 1081, 1699]
+[:mouse_move, 555, 172, 2, 1082, 1700]
+[:mouse_move, 555, 165, 2, 1083, 1701]
+[:mouse_move, 555, 158, 2, 1084, 1702]
+[:mouse_move, 555, 150, 2, 1085, 1703]
+[:mouse_move, 556, 133, 2, 1086, 1704]
+[:mouse_move, 557, 128, 2, 1087, 1705]
+[:mouse_move, 558, 118, 2, 1088, 1706]
+[:mouse_move, 559, 113, 2, 1089, 1707]
+[:mouse_move, 562, 101, 2, 1090, 1708]
+[:mouse_move, 563, 94, 2, 1091, 1709]
+[:mouse_move, 565, 88, 2, 1092, 1710]
+[:mouse_move, 567, 81, 2, 1093, 1711]
+[:mouse_move, 570, 73, 2, 1094, 1712]
+[:mouse_move, 571, 71, 2, 1095, 1713]
+[:mouse_move, 571, 68, 2, 1096, 1714]
+[:mouse_move, 572, 68, 2, 1097, 1715]
+[:mouse_move, 572, 67, 2, 1098, 1716]
+[:mouse_move, 572, 68, 2, 1099, 1726]
+[:mouse_move, 571, 68, 2, 1100, 1729]
+[:mouse_move, 570, 69, 2, 1101, 1732]
+[:mouse_move, 570, 70, 2, 1102, 1734]
+[:mouse_move, 570, 71, 2, 1103, 1737]
+[:mouse_move, 570, 72, 2, 1104, 1739]
+[:key_down_raw, 104, 0, 2, 1105, 1790]
+[:key_up_raw, 104, 0, 2, 1106, 1795]
+[:key_down_raw, 104, 0, 2, 1107, 1829]
+[:key_up_raw, 104, 0, 2, 1108, 1834]
+[:key_down_raw, 104, 0, 2, 1109, 1840]
+[:key_up_raw, 104, 0, 2, 1110, 1845]
+[:key_down_raw, 104, 0, 2, 1111, 1850]
+[:key_up_raw, 104, 0, 2, 1112, 1853]
+[:key_down_raw, 104, 0, 2, 1113, 1858]
+[:key_up_raw, 104, 0, 2, 1114, 1864]
+[:mouse_move, 579, 93, 2, 1115, 1898]
+[:mouse_move, 607, 151, 2, 1116, 1899]
+[:mouse_move, 624, 185, 2, 1117, 1900]
+[:mouse_move, 630, 197, 2, 1118, 1901]
+[:mouse_move, 637, 214, 2, 1119, 1902]
+[:mouse_move, 639, 217, 2, 1120, 1903]
+[:mouse_move, 641, 220, 2, 1121, 1904]
+[:mouse_move, 644, 215, 2, 1122, 1913]
+[:mouse_move, 646, 211, 2, 1123, 1914]
+[:mouse_move, 649, 207, 2, 1124, 1915]
+[:mouse_move, 652, 201, 2, 1125, 1916]
+[:mouse_move, 654, 196, 2, 1126, 1917]
+[:mouse_move, 654, 194, 2, 1127, 1918]
+[:mouse_move, 655, 192, 2, 1128, 1919]
+[:mouse_move, 647, 192, 2, 1129, 1922]
+[:mouse_move, 630, 196, 2, 1130, 1923]
+[:mouse_move, 623, 197, 2, 1131, 1924]
+[:mouse_move, 605, 202, 2, 1132, 1925]
+[:mouse_move, 601, 203, 2, 1133, 1926]
+[:mouse_move, 596, 204, 2, 1134, 1927]
+[:mouse_move, 591, 205, 2, 1135, 1928]
+[:mouse_move, 590, 205, 2, 1136, 1929]
+[:mouse_move, 599, 205, 2, 1137, 1930]
+[:mouse_move, 606, 205, 2, 1138, 1931]
+[:mouse_move, 632, 200, 2, 1139, 1932]
+[:mouse_move, 657, 192, 2, 1140, 1933]
+[:mouse_move, 661, 190, 2, 1141, 1934]
+[:mouse_move, 670, 185, 2, 1142, 1935]
+[:mouse_move, 672, 184, 2, 1143, 1936]
+[:mouse_move, 680, 176, 2, 1144, 1937]
+[:mouse_move, 680, 174, 2, 1145, 1938]
+[:mouse_move, 676, 172, 2, 1146, 1939]
+[:mouse_move, 659, 171, 2, 1147, 1940]
+[:mouse_move, 647, 170, 2, 1148, 1941]
+[:mouse_move, 638, 169, 2, 1149, 1942]
+[:mouse_move, 632, 168, 2, 1150, 1943]
+[:mouse_move, 625, 167, 2, 1151, 1944]
+[:mouse_move, 623, 167, 2, 1152, 1945]
+[:mouse_move, 623, 166, 2, 1153, 1946]
+[:mouse_move, 627, 166, 2, 1154, 1948]
+[:mouse_move, 646, 169, 2, 1155, 1949]
+[:mouse_move, 664, 173, 2, 1156, 1950]
+[:mouse_move, 669, 174, 2, 1157, 1951]
+[:mouse_move, 677, 175, 2, 1158, 1952]
+[:mouse_move, 687, 176, 2, 1159, 1953]
+[:mouse_move, 691, 178, 2, 1160, 1955]
+[:mouse_move, 686, 179, 2, 1161, 1956]
+[:mouse_move, 652, 186, 2, 1162, 1957]
+[:mouse_move, 627, 192, 2, 1163, 1958]
+[:mouse_move, 606, 197, 2, 1164, 1959]
+[:mouse_move, 576, 206, 2, 1165, 1961]
+[:mouse_move, 570, 208, 2, 1166, 1962]
+[:mouse_move, 564, 209, 2, 1167, 1963]
+[:mouse_move, 563, 210, 2, 1168, 1964]
+[:mouse_move, 562, 210, 2, 1169, 1965]
+[:mouse_move, 561, 210, 2, 1170, 1966]
+[:mouse_move, 558, 210, 2, 1171, 1968]
+[:mouse_move, 554, 210, 2, 1172, 1969]
+[:mouse_move, 546, 209, 2, 1173, 1970]
+[:mouse_move, 529, 208, 2, 1174, 1971]
+[:mouse_move, 501, 208, 2, 1175, 1972]
+[:mouse_move, 472, 208, 2, 1176, 1973]
+[:mouse_move, 463, 209, 2, 1177, 1974]
+[:mouse_move, 457, 210, 2, 1178, 1975]
+[:mouse_move, 448, 211, 2, 1179, 1976]
+[:mouse_move, 445, 212, 2, 1180, 1977]
+[:mouse_move, 444, 212, 2, 1181, 1978]
+[:mouse_move, 446, 212, 2, 1182, 1980]
+[:mouse_move, 451, 212, 2, 1183, 1981]
+[:mouse_move, 477, 212, 2, 1184, 1982]
+[:mouse_move, 539, 206, 2, 1185, 1984]
+[:mouse_move, 574, 202, 2, 1186, 1985]
+[:mouse_move, 596, 199, 2, 1187, 1986]
+[:mouse_move, 621, 196, 2, 1188, 1987]
+[:mouse_move, 626, 195, 2, 1189, 1988]
+[:mouse_move, 634, 194, 2, 1190, 1989]
+[:mouse_move, 644, 193, 2, 1191, 1990]
+[:mouse_move, 646, 193, 2, 1192, 1991]
+[:mouse_move, 648, 193, 2, 1193, 1992]
+[:mouse_move, 649, 193, 2, 1194, 1994]
+[:key_down_player_one, 15, 0, 1, 1195, 2050]
+[:key_held_player_one, 15, 0, 1, 1196, 2051]
+[:key_held_player_one, 15, 0, 1, 1197, 2052]
+[:key_held_player_one, 15, 0, 1, 1198, 2053]
+[:key_held_player_one, 15, 0, 1, 1199, 2054]
+[:key_held_player_one, 15, 0, 1, 1200, 2055]
+[:key_held_player_one, 15, 0, 1, 1201, 2056]
+[:key_up_player_one, 15, 0, 1, 1202, 2057]
+[:key_down_player_one, 15, 0, 1, 1203, 2085]
+[:key_held_player_one, 15, 0, 1, 1204, 2086]
+[:key_held_player_one, 15, 0, 1, 1205, 2087]
+[:key_held_player_one, 15, 0, 1, 1206, 2088]
+[:key_held_player_one, 15, 0, 1, 1207, 2089]
+[:key_up_player_one, 15, 0, 1, 1208, 2090]
+[:key_down_player_one, 15, 0, 1, 1209, 2107]
+[:key_held_player_one, 15, 0, 1, 1210, 2108]
+[:key_held_player_one, 15, 0, 1, 1211, 2109]
+[:key_held_player_one, 15, 0, 1, 1212, 2110]
+[:key_held_player_one, 15, 0, 1, 1213, 2111]
+[:key_held_player_one, 15, 0, 1, 1214, 2112]
+[:key_held_player_one, 15, 0, 1, 1215, 2113]
+[:key_held_player_one, 15, 0, 1, 1216, 2114]
+[:key_held_player_one, 15, 0, 1, 1217, 2115]
+[:key_held_player_one, 15, 0, 1, 1218, 2116]
+[:key_held_player_one, 15, 0, 1, 1219, 2117]
+[:key_held_player_one, 15, 0, 1, 1220, 2118]
+[:key_held_player_one, 15, 0, 1, 1221, 2119]
+[:key_held_player_one, 15, 0, 1, 1222, 2120]
+[:key_held_player_one, 15, 0, 1, 1223, 2121]
+[:key_held_player_one, 15, 0, 1, 1224, 2122]
+[:key_held_player_one, 15, 0, 1, 1225, 2123]
+[:key_held_player_one, 15, 0, 1, 1226, 2124]
+[:key_held_player_one, 15, 0, 1, 1227, 2125]
+[:key_held_player_one, 15, 0, 1, 1228, 2126]
+[:key_held_player_one, 15, 0, 1, 1229, 2127]
+[:key_held_player_one, 15, 0, 1, 1230, 2128]
+[:key_held_player_one, 15, 0, 1, 1231, 2129]
+[:key_held_player_one, 15, 0, 1, 1232, 2130]
+[:key_held_player_one, 15, 0, 1, 1233, 2131]
+[:key_held_player_one, 15, 0, 1, 1234, 2132]
+[:key_held_player_one, 15, 0, 1, 1235, 2133]
+[:key_held_player_one, 15, 0, 1, 1236, 2134]
+[:key_held_player_one, 15, 0, 1, 1237, 2135]
+[:key_held_player_one, 15, 0, 1, 1238, 2136]
+[:key_held_player_one, 15, 0, 1, 1239, 2137]
+[:key_held_player_one, 15, 0, 1, 1240, 2138]
+[:key_held_player_one, 15, 0, 1, 1241, 2139]
+[:key_held_player_one, 15, 0, 1, 1242, 2140]
+[:key_held_player_one, 15, 0, 1, 1243, 2141]
+[:key_held_player_one, 15, 0, 1, 1244, 2142]
+[:key_held_player_one, 15, 0, 1, 1245, 2143]
+[:key_held_player_one, 15, 0, 1, 1246, 2144]
+[:key_held_player_one, 15, 0, 1, 1247, 2145]
+[:key_held_player_one, 15, 0, 1, 1248, 2146]
+[:key_held_player_one, 15, 0, 1, 1249, 2147]
+[:key_held_player_one, 15, 0, 1, 1250, 2148]
+[:key_held_player_one, 15, 0, 1, 1251, 2149]
+[:key_held_player_one, 15, 0, 1, 1252, 2150]
+[:key_held_player_one, 15, 0, 1, 1253, 2151]
+[:key_held_player_one, 15, 0, 1, 1254, 2152]
+[:key_held_player_one, 15, 0, 1, 1255, 2153]
+[:key_held_player_one, 15, 0, 1, 1256, 2154]
+[:key_held_player_one, 15, 0, 1, 1257, 2155]
+[:key_held_player_one, 15, 0, 1, 1258, 2156]
+[:key_held_player_one, 15, 0, 1, 1259, 2157]
+[:key_held_player_one, 15, 0, 1, 1260, 2158]
+[:key_held_player_one, 15, 0, 1, 1261, 2159]
+[:key_held_player_one, 15, 0, 1, 1262, 2160]
+[:key_held_player_one, 15, 0, 1, 1263, 2161]
+[:key_held_player_one, 15, 0, 1, 1264, 2162]
+[:key_held_player_one, 15, 0, 1, 1265, 2163]
+[:key_held_player_one, 15, 0, 1, 1266, 2164]
+[:key_held_player_one, 15, 0, 1, 1267, 2165]
+[:key_held_player_one, 15, 0, 1, 1268, 2166]
+[:key_held_player_one, 15, 0, 1, 1269, 2167]
+[:key_held_player_one, 15, 0, 1, 1270, 2168]
+[:key_held_player_one, 15, 0, 1, 1271, 2169]
+[:key_held_player_one, 15, 0, 1, 1272, 2170]
+[:key_held_player_one, 15, 0, 1, 1273, 2171]
+[:key_held_player_one, 15, 0, 1, 1274, 2172]
+[:key_held_player_one, 15, 0, 1, 1275, 2173]
+[:key_held_player_one, 15, 0, 1, 1276, 2174]
+[:key_held_player_one, 15, 0, 1, 1277, 2175]
+[:key_held_player_one, 15, 0, 1, 1278, 2176]
+[:key_up_player_one, 15, 0, 1, 1279, 2177]
+[:key_down_player_one, 15, 0, 1, 1280, 2221]
+[:key_held_player_one, 15, 0, 1, 1281, 2222]
+[:key_held_player_one, 15, 0, 1, 1282, 2223]
+[:key_held_player_one, 15, 0, 1, 1283, 2224]
+[:key_held_player_one, 15, 0, 1, 1284, 2225]
+[:key_held_player_one, 15, 0, 1, 1285, 2226]
+[:key_held_player_one, 15, 0, 1, 1286, 2227]
+[:key_held_player_one, 15, 0, 1, 1287, 2228]
+[:key_held_player_one, 15, 0, 1, 1288, 2229]
+[:key_held_player_one, 15, 0, 1, 1289, 2230]
+[:key_held_player_one, 15, 0, 1, 1290, 2231]
+[:key_held_player_one, 15, 0, 1, 1291, 2232]
+[:key_held_player_one, 15, 0, 1, 1292, 2233]
+[:key_held_player_one, 15, 0, 1, 1293, 2234]
+[:key_held_player_one, 15, 0, 1, 1294, 2235]
+[:key_held_player_one, 15, 0, 1, 1295, 2236]
+[:key_held_player_one, 15, 0, 1, 1296, 2237]
+[:key_held_player_one, 15, 0, 1, 1297, 2238]
+[:key_held_player_one, 15, 0, 1, 1298, 2239]
+[:key_held_player_one, 15, 0, 1, 1299, 2240]
+[:key_held_player_one, 15, 0, 1, 1300, 2241]
+[:key_held_player_one, 15, 0, 1, 1301, 2242]
+[:key_held_player_one, 15, 0, 1, 1302, 2243]
+[:key_held_player_one, 15, 0, 1, 1303, 2244]
+[:key_held_player_one, 15, 0, 1, 1304, 2245]
+[:key_held_player_one, 15, 0, 1, 1305, 2246]
+[:key_held_player_one, 15, 0, 1, 1306, 2247]
+[:key_held_player_one, 15, 0, 1, 1307, 2248]
+[:key_held_player_one, 15, 0, 1, 1308, 2249]
+[:key_held_player_one, 15, 0, 1, 1309, 2250]
+[:key_held_player_one, 15, 0, 1, 1310, 2251]
+[:key_held_player_one, 15, 0, 1, 1311, 2252]
+[:key_held_player_one, 15, 0, 1, 1312, 2253]
+[:key_held_player_one, 15, 0, 1, 1313, 2254]
+[:key_held_player_one, 15, 0, 1, 1314, 2255]
+[:key_held_player_one, 15, 0, 1, 1315, 2256]
+[:key_held_player_one, 15, 0, 1, 1316, 2257]
+[:key_held_player_one, 15, 0, 1, 1317, 2258]
+[:key_held_player_one, 15, 0, 1, 1318, 2259]
+[:key_held_player_one, 15, 0, 1, 1319, 2260]
+[:key_held_player_one, 15, 0, 1, 1320, 2261]
+[:key_held_player_one, 15, 0, 1, 1321, 2262]
+[:key_held_player_one, 15, 0, 1, 1322, 2263]
+[:key_held_player_one, 15, 0, 1, 1323, 2264]
+[:key_held_player_one, 15, 0, 1, 1324, 2265]
+[:key_up_player_one, 15, 0, 1, 1325, 2266]
+[:mouse_move, 644, 198, 2, 1326, 2321]
+[:mouse_move, 544, 260, 2, 1327, 2321]
+[:mouse_move, 539, 261, 2, 1328, 2323]
+[:mouse_move, 536, 261, 2, 1329, 2325]
+[:mouse_move, 531, 262, 2, 1330, 2326]
+[:mouse_move, 529, 262, 2, 1331, 2327]
+[:mouse_move, 528, 262, 2, 1332, 2328]
+[:mouse_move, 527, 261, 2, 1333, 2330]
+[:mouse_move, 526, 261, 2, 1334, 2331]
+[:mouse_move, 525, 261, 2, 1335, 2333]
+[:mouse_move, 526, 261, 2, 1336, 2342]
+[:mouse_move, 533, 261, 2, 1337, 2343]
+[:mouse_move, 539, 261, 2, 1338, 2344]
+[:mouse_move, 555, 261, 2, 1339, 2345]
+[:mouse_move, 572, 261, 2, 1340, 2346]
+[:mouse_move, 587, 261, 2, 1341, 2347]
+[:mouse_move, 597, 261, 2, 1342, 2348]
+[:mouse_move, 622, 262, 2, 1343, 2349]
+[:mouse_move, 644, 263, 2, 1344, 2350]
+[:mouse_move, 670, 266, 2, 1345, 2351]
+[:mouse_move, 677, 266, 2, 1346, 2352]
+[:mouse_move, 701, 268, 2, 1347, 2353]
+[:mouse_move, 710, 269, 2, 1348, 2354]
+[:mouse_move, 734, 269, 2, 1349, 2355]
+[:mouse_move, 738, 269, 2, 1350, 2356]
+[:mouse_move, 751, 267, 2, 1351, 2357]
+[:mouse_move, 757, 267, 2, 1352, 2358]
+[:mouse_move, 765, 267, 2, 1353, 2359]
+[:mouse_move, 769, 266, 2, 1354, 2360]
+[:mouse_move, 777, 266, 2, 1355, 2361]
+[:mouse_move, 780, 266, 2, 1356, 2362]
+[:mouse_move, 782, 266, 2, 1357, 2363]
+[:mouse_move, 784, 266, 2, 1358, 2364]
+[:mouse_move, 779, 265, 2, 1359, 2366]
+[:mouse_move, 764, 263, 2, 1360, 2367]
+[:mouse_move, 724, 260, 2, 1361, 2368]
+[:mouse_move, 695, 257, 2, 1362, 2369]
+[:mouse_move, 629, 250, 2, 1363, 2370]
+[:mouse_move, 597, 248, 2, 1364, 2371]
+[:mouse_move, 558, 246, 2, 1365, 2372]
+[:mouse_move, 534, 246, 2, 1366, 2373]
+[:mouse_move, 509, 245, 2, 1367, 2374]
+[:mouse_move, 504, 245, 2, 1368, 2375]
+[:mouse_move, 487, 245, 2, 1369, 2376]
+[:mouse_move, 483, 246, 2, 1370, 2377]
+[:mouse_move, 478, 247, 2, 1371, 2378]
+[:mouse_move, 477, 247, 2, 1372, 2379]
+[:mouse_move, 483, 247, 2, 1373, 2382]
+[:mouse_move, 492, 247, 2, 1374, 2383]
+[:mouse_move, 526, 249, 2, 1375, 2384]
+[:mouse_move, 545, 250, 2, 1376, 2385]
+[:mouse_move, 576, 252, 2, 1377, 2386]
+[:mouse_move, 585, 253, 2, 1378, 2387]
+[:mouse_move, 599, 254, 2, 1379, 2388]
+[:mouse_move, 617, 255, 2, 1380, 2389]
+[:mouse_move, 624, 255, 2, 1381, 2390]
+[:mouse_move, 632, 256, 2, 1382, 2391]
+[:mouse_move, 634, 257, 2, 1383, 2392]
+[:mouse_move, 636, 257, 2, 1384, 2393]
+[:mouse_move, 637, 257, 2, 1385, 2396]
+[:mouse_move, 637, 258, 2, 1386, 2397]
+[:mouse_move, 638, 258, 2, 1387, 2398]
+[:mouse_move, 642, 258, 2, 1388, 2399]
+[:mouse_move, 644, 259, 2, 1389, 2400]
+[:mouse_move, 648, 259, 2, 1390, 2401]
+[:mouse_move, 650, 259, 2, 1391, 2402]
+[:mouse_move, 654, 260, 2, 1392, 2403]
+[:mouse_move, 655, 260, 2, 1393, 2404]
+[:mouse_button_pressed, 1, 0, 1, 1394, 2405]
+[:mouse_button_up, 1, 0, 1, 1395, 2413]
+[:mouse_button_pressed, 1, 0, 1, 1396, 2434]
+[:mouse_button_up, 1, 0, 1, 1397, 2443]
+[:mouse_move, 656, 260, 2, 1398, 2447]
+[:mouse_move, 659, 260, 2, 1399, 2448]
+[:mouse_move, 670, 260, 2, 1400, 2449]
+[:mouse_move, 678, 260, 2, 1401, 2450]
+[:mouse_move, 699, 260, 2, 1402, 2451]
+[:mouse_move, 703, 260, 2, 1403, 2452]
+[:mouse_move, 719, 259, 2, 1404, 2453]
+[:mouse_move, 727, 259, 2, 1405, 2454]
+[:mouse_move, 737, 258, 2, 1406, 2455]
+[:mouse_move, 739, 258, 2, 1407, 2456]
+[:mouse_move, 746, 257, 2, 1408, 2457]
+[:mouse_move, 749, 256, 2, 1409, 2458]
+[:mouse_move, 752, 256, 2, 1410, 2459]
+[:mouse_move, 754, 255, 2, 1411, 2461]
+[:mouse_button_pressed, 1, 0, 1, 1412, 2463]
+[:mouse_button_up, 1, 0, 1, 1413, 2472]
+[:mouse_move, 753, 255, 2, 1414, 2473]
+[:mouse_move, 742, 255, 2, 1415, 2474]
+[:mouse_move, 727, 254, 2, 1416, 2475]
+[:mouse_move, 694, 248, 2, 1417, 2476]
+[:mouse_move, 655, 236, 2, 1418, 2477]
+[:mouse_move, 607, 222, 2, 1419, 2478]
+[:mouse_move, 577, 214, 2, 1420, 2479]
+[:mouse_move, 559, 211, 2, 1421, 2480]
+[:mouse_move, 554, 211, 2, 1422, 2481]
+[:mouse_move, 537, 209, 2, 1423, 2482]
+[:mouse_move, 533, 209, 2, 1424, 2483]
+[:mouse_move, 529, 209, 2, 1425, 2484]
+[:mouse_button_pressed, 1, 0, 1, 1426, 2487]
+[:mouse_button_up, 1, 0, 1, 1427, 2497]
+[:mouse_move, 534, 212, 2, 1428, 2500]
+[:mouse_move, 553, 223, 2, 1429, 2501]
+[:mouse_move, 571, 232, 2, 1430, 2502]
+[:mouse_move, 620, 251, 2, 1431, 2503]
+[:mouse_move, 681, 272, 2, 1432, 2504]
+[:mouse_move, 763, 299, 2, 1433, 2505]
+[:mouse_move, 781, 308, 2, 1434, 2506]
+[:mouse_move, 846, 344, 2, 1435, 2507]
+[:mouse_move, 855, 352, 2, 1436, 2508]
+[:mouse_move, 890, 382, 2, 1437, 2509]
+[:mouse_move, 902, 396, 2, 1438, 2510]
+[:mouse_move, 918, 425, 2, 1439, 2511]
+[:mouse_move, 925, 440, 2, 1440, 2512]
+[:mouse_move, 930, 461, 2, 1441, 2513]
+[:mouse_move, 933, 474, 2, 1442, 2514]
+[:mouse_move, 937, 493, 2, 1443, 2515]
+[:mouse_move, 937, 496, 2, 1444, 2516]
+[:mouse_move, 938, 507, 2, 1445, 2517]
+[:mouse_move, 940, 513, 2, 1446, 2518]
+[:mouse_move, 940, 519, 2, 1447, 2519]
+[:mouse_move, 940, 521, 2, 1448, 2520]
+[:mouse_move, 940, 525, 2, 1449, 2521]
+[:mouse_move, 940, 527, 2, 1450, 2522]
+[:mouse_move, 939, 528, 2, 1451, 2523]
+[:mouse_move, 938, 529, 2, 1452, 2524]
+[:mouse_move, 937, 529, 2, 1453, 2525]
+[:mouse_move, 936, 529, 2, 1454, 2526]
+[:mouse_move, 934, 529, 2, 1455, 2527]
+[:mouse_move, 930, 526, 2, 1456, 2528]
+[:mouse_move, 927, 524, 2, 1457, 2529]
+[:mouse_move, 920, 521, 2, 1458, 2530]
+[:mouse_move, 915, 520, 2, 1459, 2531]
+[:mouse_move, 905, 514, 2, 1460, 2532]
+[:mouse_move, 897, 507, 2, 1461, 2533]
+[:mouse_move, 876, 480, 2, 1462, 2534]
+[:mouse_move, 864, 464, 2, 1463, 2535]
+[:mouse_move, 846, 437, 2, 1464, 2536]
+[:mouse_move, 841, 431, 2, 1465, 2537]
+[:mouse_move, 825, 407, 2, 1466, 2538]
+[:mouse_move, 818, 397, 2, 1467, 2539]
+[:mouse_move, 801, 372, 2, 1468, 2540]
+[:mouse_move, 797, 364, 2, 1469, 2541]
+[:mouse_move, 794, 357, 2, 1470, 2542]
+[:mouse_move, 792, 352, 2, 1471, 2543]
+[:mouse_move, 789, 345, 2, 1472, 2544]
+[:mouse_move, 788, 343, 2, 1473, 2545]
+[:mouse_move, 788, 340, 2, 1474, 2546]
+[:mouse_move, 787, 338, 2, 1475, 2547]
+[:mouse_move, 787, 337, 2, 1476, 2548]
+[:mouse_move, 787, 336, 2, 1477, 2549]
+[:mouse_move, 786, 335, 2, 1478, 2550]
+[:mouse_move, 786, 334, 2, 1479, 2551]
+[:mouse_move, 786, 333, 2, 1480, 2553]
+[:mouse_button_pressed, 1, 0, 1, 1481, 2558]
+[:mouse_button_up, 1, 0, 1, 1482, 2567]
+[:mouse_move, 784, 333, 2, 1483, 2573]
+[:mouse_move, 782, 333, 2, 1484, 2574]
+[:mouse_move, 769, 333, 2, 1485, 2575]
+[:mouse_move, 762, 333, 2, 1486, 2576]
+[:mouse_move, 758, 333, 2, 1487, 2577]
+[:mouse_move, 740, 333, 2, 1488, 2578]
+[:mouse_move, 733, 333, 2, 1489, 2579]
+[:mouse_move, 720, 333, 2, 1490, 2580]
+[:mouse_move, 717, 333, 2, 1491, 2581]
+[:mouse_move, 710, 333, 2, 1492, 2582]
+[:mouse_move, 708, 333, 2, 1493, 2583]
+[:mouse_move, 705, 333, 2, 1494, 2584]
+[:mouse_move, 704, 333, 2, 1495, 2585]
+[:mouse_move, 703, 333, 2, 1496, 2586]
+[:mouse_button_pressed, 1, 0, 1, 1497, 2588]
+[:mouse_button_up, 1, 0, 1, 1498, 2597]
+[:mouse_move, 704, 333, 2, 1499, 2600]
+[:mouse_move, 706, 333, 2, 1500, 2601]
+[:mouse_move, 715, 333, 2, 1501, 2602]
+[:mouse_move, 725, 333, 2, 1502, 2603]
+[:mouse_move, 740, 333, 2, 1503, 2604]
+[:mouse_move, 749, 333, 2, 1504, 2605]
+[:mouse_move, 753, 333, 2, 1505, 2606]
+[:mouse_move, 772, 333, 2, 1506, 2607]
+[:mouse_move, 781, 333, 2, 1507, 2608]
+[:mouse_move, 793, 333, 2, 1508, 2609]
+[:mouse_move, 799, 333, 2, 1509, 2610]
+[:mouse_move, 805, 333, 2, 1510, 2611]
+[:mouse_move, 807, 333, 2, 1511, 2612]
+[:mouse_move, 810, 333, 2, 1512, 2613]
+[:mouse_move, 811, 333, 2, 1513, 2614]
+[:mouse_move, 811, 332, 2, 1514, 2616]
+[:mouse_button_pressed, 1, 0, 1, 1515, 2618]
+[:mouse_button_up, 1, 0, 1, 1516, 2629]
+[:mouse_move, 810, 332, 2, 1517, 2634]
+[:mouse_move, 809, 332, 2, 1518, 2635]
+[:mouse_move, 804, 335, 2, 1519, 2636]
+[:mouse_move, 799, 339, 2, 1520, 2637]
+[:mouse_move, 787, 346, 2, 1521, 2638]
+[:mouse_move, 778, 349, 2, 1522, 2639]
+[:mouse_move, 745, 362, 2, 1523, 2640]
+[:mouse_move, 726, 366, 2, 1524, 2641]
+[:mouse_move, 698, 374, 2, 1525, 2642]
+[:mouse_move, 679, 378, 2, 1526, 2643]
+[:mouse_move, 655, 384, 2, 1527, 2644]
+[:mouse_move, 641, 387, 2, 1528, 2645]
+[:mouse_move, 623, 393, 2, 1529, 2646]
+[:mouse_move, 620, 394, 2, 1530, 2647]
+[:mouse_move, 611, 397, 2, 1531, 2648]
+[:mouse_move, 608, 398, 2, 1532, 2649]
+[:mouse_move, 605, 400, 2, 1533, 2650]
+[:mouse_move, 604, 401, 2, 1534, 2651]
+[:mouse_move, 602, 402, 2, 1535, 2652]
+[:mouse_move, 601, 402, 2, 1536, 2653]
+[:mouse_move, 600, 403, 2, 1537, 2654]
+[:mouse_move, 599, 403, 2, 1538, 2655]
+[:mouse_move, 598, 404, 2, 1539, 2656]
+[:mouse_button_pressed, 1, 0, 1, 1540, 2659]
+[:mouse_move, 597, 404, 2, 1541, 2659]
+[:mouse_button_up, 1, 0, 1, 1542, 2669]
+[:mouse_move, 598, 404, 2, 1543, 2677]
+[:mouse_move, 600, 404, 2, 1544, 2678]
+[:mouse_move, 607, 407, 2, 1545, 2679]
+[:mouse_move, 612, 409, 2, 1546, 2680]
+[:mouse_move, 622, 412, 2, 1547, 2681]
+[:mouse_move, 628, 414, 2, 1548, 2682]
+[:mouse_move, 639, 416, 2, 1549, 2683]
+[:mouse_move, 643, 417, 2, 1550, 2684]
+[:mouse_move, 654, 418, 2, 1551, 2685]
+[:mouse_move, 658, 418, 2, 1552, 2686]
+[:mouse_move, 662, 418, 2, 1553, 2687]
+[:mouse_move, 667, 418, 2, 1554, 2688]
+[:mouse_move, 671, 418, 2, 1555, 2689]
+[:mouse_move, 675, 418, 2, 1556, 2690]
+[:mouse_move, 677, 418, 2, 1557, 2691]
+[:mouse_move, 679, 418, 2, 1558, 2692]
+[:mouse_move, 680, 418, 2, 1559, 2695]
+[:mouse_button_pressed, 1, 0, 1, 1560, 2696]
+[:mouse_button_up, 1, 0, 1, 1561, 2706]
+[:mouse_move, 678, 418, 2, 1562, 2717]
+[:mouse_move, 677, 418, 2, 1563, 2718]
+[:mouse_move, 670, 418, 2, 1564, 2719]
+[:mouse_move, 668, 418, 2, 1565, 2720]
+[:mouse_move, 663, 418, 2, 1566, 2721]
+[:mouse_move, 661, 418, 2, 1567, 2722]
+[:mouse_move, 660, 418, 2, 1568, 2723]
+[:mouse_move, 658, 418, 2, 1569, 2731]
+[:mouse_move, 657, 418, 2, 1570, 2732]
+[:mouse_move, 651, 419, 2, 1571, 2733]
+[:mouse_move, 649, 419, 2, 1572, 2734]
+[:mouse_move, 645, 420, 2, 1573, 2735]
+[:mouse_move, 642, 420, 2, 1574, 2736]
+[:mouse_move, 640, 420, 2, 1575, 2737]
+[:mouse_move, 639, 420, 2, 1576, 2738]
+[:mouse_move, 638, 420, 2, 1577, 2739]
+[:mouse_button_pressed, 1, 0, 1, 1578, 2743]
+[:mouse_button_up, 1, 0, 1, 1579, 2752]
+[:mouse_move, 637, 420, 2, 1580, 2765]
+[:mouse_move, 634, 420, 2, 1581, 2766]
+[:mouse_move, 631, 420, 2, 1582, 2767]
+[:mouse_move, 628, 420, 2, 1583, 2768]
+[:mouse_move, 622, 420, 2, 1584, 2769]
+[:mouse_move, 619, 420, 2, 1585, 2770]
+[:mouse_move, 613, 421, 2, 1586, 2771]
+[:mouse_move, 611, 421, 2, 1587, 2772]
+[:mouse_move, 609, 421, 2, 1588, 2773]
+[:mouse_move, 608, 421, 2, 1589, 2774]
+[:mouse_button_pressed, 1, 0, 1, 1590, 2780]
+[:mouse_button_up, 1, 0, 1, 1591, 2790]
+[:mouse_move, 612, 421, 2, 1592, 2798]
+[:mouse_move, 613, 421, 2, 1593, 2799]
+[:mouse_move, 617, 421, 2, 1594, 2800]
+[:mouse_move, 618, 421, 2, 1595, 2801]
+[:mouse_move, 621, 421, 2, 1596, 2802]
+[:mouse_move, 622, 421, 2, 1597, 2803]
+[:mouse_move, 623, 421, 2, 1598, 2804]
+[:mouse_move, 626, 421, 2, 1599, 2816]
+[:mouse_move, 629, 420, 2, 1600, 2817]
+[:mouse_move, 633, 420, 2, 1601, 2818]
+[:mouse_move, 635, 420, 2, 1602, 2819]
+[:mouse_move, 638, 420, 2, 1603, 2820]
+[:mouse_move, 639, 420, 2, 1604, 2822]
+[:mouse_move, 639, 419, 2, 1605, 2827]
+[:mouse_move, 638, 419, 2, 1606, 2829]
+[:mouse_move, 638, 418, 2, 1607, 2831]
+[:mouse_move, 637, 418, 2, 1608, 2832]
+[:mouse_button_pressed, 1, 0, 1, 1609, 2836]
+[:mouse_button_up, 1, 0, 1, 1610, 2845]
+[:mouse_move, 639, 419, 2, 1611, 2859]
+[:mouse_move, 644, 421, 2, 1612, 2860]
+[:mouse_move, 648, 421, 2, 1613, 2861]
+[:mouse_move, 655, 422, 2, 1614, 2862]
+[:mouse_move, 657, 423, 2, 1615, 2863]
+[:mouse_move, 664, 423, 2, 1616, 2864]
+[:mouse_move, 666, 423, 2, 1617, 2865]
+[:mouse_move, 669, 423, 2, 1618, 2866]
+[:mouse_move, 670, 423, 2, 1619, 2867]
+[:mouse_move, 671, 423, 2, 1620, 2868]
+[:mouse_button_pressed, 1, 0, 1, 1621, 2869]
+[:mouse_button_up, 1, 0, 1, 1622, 2877]
+[:mouse_move, 671, 424, 2, 1623, 2889]
+[:mouse_move, 671, 427, 2, 1624, 2890]
+[:mouse_move, 670, 434, 2, 1625, 2891]
+[:mouse_move, 669, 439, 2, 1626, 2892]
+[:mouse_move, 665, 459, 2, 1627, 2893]
+[:mouse_move, 662, 470, 2, 1628, 2894]
+[:mouse_move, 657, 485, 2, 1629, 2895]
+[:mouse_move, 654, 495, 2, 1630, 2896]
+[:mouse_move, 646, 510, 2, 1631, 2897]
+[:mouse_move, 645, 513, 2, 1632, 2898]
+[:mouse_move, 640, 520, 2, 1633, 2899]
+[:mouse_move, 638, 522, 2, 1634, 2900]
+[:mouse_move, 632, 527, 2, 1635, 2901]
+[:mouse_move, 631, 528, 2, 1636, 2902]
+[:mouse_move, 626, 531, 2, 1637, 2903]
+[:mouse_move, 624, 532, 2, 1638, 2904]
+[:mouse_move, 622, 533, 2, 1639, 2905]
+[:mouse_move, 619, 535, 2, 1640, 2906]
+[:mouse_move, 618, 535, 2, 1641, 2907]
+[:mouse_move, 617, 536, 2, 1642, 2908]
+[:mouse_move, 616, 536, 2, 1643, 2910]
+[:mouse_move, 615, 536, 2, 1644, 2913]
+[:mouse_button_pressed, 1, 0, 1, 1645, 2916]
+[:mouse_button_up, 1, 0, 1, 1646, 2922]
+[:mouse_button_pressed, 1, 0, 1, 1647, 2967]
+[:mouse_button_up, 1, 0, 1, 1648, 2974]
+[:mouse_move, 615, 540, 2, 1649, 2999]
+[:mouse_move, 615, 544, 2, 1650, 3000]
+[:mouse_move, 613, 554, 2, 1651, 3001]
+[:mouse_move, 612, 560, 2, 1652, 3002]
+[:mouse_move, 611, 567, 2, 1653, 3003]
+[:mouse_move, 610, 571, 2, 1654, 3004]
+[:mouse_move, 609, 578, 2, 1655, 3005]
+[:mouse_move, 608, 581, 2, 1656, 3006]
+[:mouse_move, 607, 585, 2, 1657, 3007]
+[:mouse_move, 607, 586, 2, 1658, 3008]
+[:mouse_move, 606, 589, 2, 1659, 3009]
+[:mouse_move, 606, 590, 2, 1660, 3010]
+[:mouse_move, 605, 591, 2, 1661, 3011]
+[:mouse_move, 605, 592, 2, 1662, 3013]
+[:mouse_move, 604, 592, 2, 1663, 3014]
+[:mouse_move, 604, 593, 2, 1664, 3017]
+[:mouse_button_pressed, 1, 0, 1, 1665, 3024]
+[:mouse_button_up, 1, 0, 1, 1666, 3031]
+[:mouse_move, 606, 594, 2, 1667, 3119]
+[:mouse_move, 609, 594, 2, 1668, 3120]
+[:mouse_move, 615, 594, 2, 1669, 3121]
+[:mouse_move, 643, 594, 2, 1670, 3122]
+[:mouse_move, 663, 593, 2, 1671, 3123]
+[:mouse_move, 713, 585, 2, 1672, 3124]
+[:mouse_move, 743, 579, 2, 1673, 3125]
+[:mouse_move, 807, 561, 2, 1674, 3126]
+[:mouse_move, 837, 548, 2, 1675, 3127]
+[:mouse_move, 887, 518, 2, 1676, 3128]
+[:mouse_move, 910, 497, 2, 1677, 3129]
+[:mouse_move, 947, 446, 2, 1678, 3130]
+[:mouse_move, 962, 416, 2, 1679, 3131]
+[:mouse_move, 984, 351, 2, 1680, 3132]
+[:mouse_move, 991, 319, 2, 1681, 3133]
+[:mouse_move, 995, 225, 2, 1682, 3134]
+[:mouse_move, 997, 225, 2, 1683, 3151]
+[:mouse_move, 1001, 224, 2, 1684, 3152]
+[:mouse_move, 1010, 220, 2, 1685, 3153]
+[:mouse_move, 1013, 218, 2, 1686, 3154]
+[:mouse_move, 1019, 214, 2, 1687, 3155]
+[:mouse_move, 1021, 213, 2, 1688, 3156]
+[:mouse_move, 1026, 209, 2, 1689, 3157]
+[:mouse_move, 1029, 206, 2, 1690, 3158]
+[:mouse_move, 1032, 203, 2, 1691, 3159]
+[:mouse_move, 1033, 202, 2, 1692, 3160]
+[:mouse_move, 1033, 200, 2, 1693, 3161]
+[:mouse_move, 1034, 200, 2, 1694, 3162]
+[:mouse_move, 1035, 195, 2, 1695, 3163]
+[:mouse_move, 1037, 193, 2, 1696, 3164]
+[:mouse_move, 1047, 184, 2, 1697, 3165]
+[:mouse_move, 1055, 179, 2, 1698, 3166]
+[:mouse_move, 1079, 166, 2, 1699, 3167]
+[:mouse_move, 1093, 158, 2, 1700, 3168]
+[:mouse_move, 1122, 141, 2, 1701, 3169]
+[:mouse_move, 1133, 132, 2, 1702, 3170]
+[:mouse_move, 1144, 119, 2, 1703, 3171]
+[:mouse_move, 1149, 111, 2, 1704, 3172]
+[:mouse_move, 1150, 92, 2, 1705, 3173]
+[:mouse_move, 1149, 86, 2, 1706, 3174]
+[:mouse_move, 1142, 79, 2, 1707, 3175]
+[:mouse_move, 1123, 65, 2, 1708, 3176]
+[:mouse_move, 1117, 63, 2, 1709, 3177]
+[:mouse_move, 1099, 51, 2, 1710, 3178]
+[:mouse_move, 1084, 42, 2, 1711, 3179]
+[:mouse_move, 1066, 31, 2, 1712, 3180]
+[:mouse_move, 1057, 25, 2, 1713, 3181]
+[:mouse_move, 1037, 13, 2, 1714, 3182]
+[:mouse_move, 1031, 11, 2, 1715, 3183]
+[:mouse_move, 1005, 0, 2, 1716, 3184]
+[:mouse_move, 994, 0, 2, 1717, 3185]
+[:mouse_move, 852, 0, 2, 1718, 3196]
+[:mouse_move, 846, 3, 2, 1719, 3197]
+[:mouse_move, 837, 9, 2, 1720, 3198]
+[:mouse_move, 832, 13, 2, 1721, 3199]
+[:mouse_move, 823, 21, 2, 1722, 3200]
+[:mouse_move, 815, 29, 2, 1723, 3201]
+[:mouse_move, 808, 38, 2, 1724, 3202]
+[:mouse_move, 804, 45, 2, 1725, 3203]
+[:mouse_move, 802, 47, 2, 1726, 3204]
+[:mouse_move, 797, 55, 2, 1727, 3205]
+[:mouse_move, 796, 58, 2, 1728, 3206]
+[:mouse_move, 794, 62, 2, 1729, 3207]
+[:mouse_move, 792, 66, 2, 1730, 3208]
+[:mouse_move, 791, 73, 2, 1731, 3209]
+[:mouse_move, 790, 77, 2, 1732, 3210]
+[:mouse_move, 787, 88, 2, 1733, 3211]
+[:mouse_move, 786, 93, 2, 1734, 3212]
+[:mouse_move, 784, 104, 2, 1735, 3213]
+[:mouse_move, 783, 111, 2, 1736, 3214]
+[:mouse_move, 782, 124, 2, 1737, 3215]
+[:mouse_move, 782, 131, 2, 1738, 3216]
+[:mouse_move, 782, 147, 2, 1739, 3217]
+[:mouse_move, 782, 154, 2, 1740, 3218]
+[:mouse_move, 782, 162, 2, 1741, 3219]
+[:mouse_move, 782, 167, 2, 1742, 3220]
+[:mouse_move, 782, 177, 2, 1743, 3221]
+[:mouse_move, 783, 181, 2, 1744, 3222]
+[:mouse_move, 786, 190, 2, 1745, 3223]
+[:mouse_move, 788, 199, 2, 1746, 3224]
+[:mouse_move, 791, 208, 2, 1747, 3225]
+[:mouse_move, 792, 211, 2, 1748, 3226]
+[:mouse_move, 795, 219, 2, 1749, 3227]
+[:mouse_move, 796, 223, 2, 1750, 3228]
+[:mouse_move, 800, 233, 2, 1751, 3229]
+[:mouse_move, 803, 240, 2, 1752, 3230]
+[:mouse_move, 806, 247, 2, 1753, 3231]
+[:mouse_move, 815, 266, 2, 1754, 3232]
+[:mouse_move, 818, 271, 2, 1755, 3233]
+[:mouse_move, 825, 288, 2, 1756, 3234]
+[:mouse_move, 828, 294, 2, 1757, 3235]
+[:mouse_move, 834, 306, 2, 1758, 3236]
+[:mouse_move, 836, 310, 2, 1759, 3237]
+[:mouse_move, 839, 318, 2, 1760, 3238]
+[:mouse_move, 840, 319, 2, 1761, 3239]
+[:mouse_move, 843, 324, 2, 1762, 3240]
+[:mouse_move, 846, 329, 2, 1763, 3241]
+[:mouse_move, 849, 334, 2, 1764, 3242]
+[:mouse_move, 852, 336, 2, 1765, 3243]
+[:mouse_move, 856, 341, 2, 1766, 3244]
+[:mouse_move, 859, 345, 2, 1767, 3245]
+[:mouse_move, 868, 353, 2, 1768, 3246]
+[:mouse_move, 876, 359, 2, 1769, 3247]
+[:mouse_move, 890, 370, 2, 1770, 3248]
+[:mouse_move, 899, 376, 2, 1771, 3249]
+[:mouse_move, 922, 386, 2, 1772, 3250]
+[:mouse_move, 934, 391, 2, 1773, 3251]
+[:mouse_move, 951, 396, 2, 1774, 3252]
+[:mouse_move, 961, 398, 2, 1775, 3253]
+[:mouse_move, 988, 403, 2, 1776, 3254]
+[:mouse_move, 993, 403, 2, 1777, 3255]
+[:mouse_move, 1010, 405, 2, 1778, 3256]
+[:mouse_move, 1019, 406, 2, 1779, 3257]
+[:mouse_move, 1026, 407, 2, 1780, 3258]
+[:mouse_move, 1045, 408, 2, 1781, 3259]
+[:mouse_move, 1060, 408, 2, 1782, 3260]
+[:mouse_move, 1078, 408, 2, 1783, 3261]
+[:mouse_move, 1099, 404, 2, 1784, 3262]
+[:mouse_move, 1105, 403, 2, 1785, 3263]
+[:mouse_move, 1122, 399, 2, 1786, 3264]
+[:mouse_move, 1136, 394, 2, 1787, 3265]
+[:mouse_move, 1151, 387, 2, 1788, 3266]
+[:mouse_move, 1166, 373, 2, 1789, 3267]
+[:mouse_move, 1169, 367, 2, 1790, 3268]
+[:mouse_move, 1180, 352, 2, 1791, 3269]
+[:mouse_move, 1186, 343, 2, 1792, 3270]
+[:mouse_move, 1194, 329, 2, 1793, 3271]
+[:mouse_move, 1197, 322, 2, 1794, 3272]
+[:mouse_move, 1206, 300, 2, 1795, 3273]
+[:mouse_move, 1208, 289, 2, 1796, 3274]
+[:mouse_move, 1212, 271, 2, 1797, 3275]
+[:mouse_move, 1214, 260, 2, 1798, 3276]
+[:mouse_move, 1217, 242, 2, 1799, 3277]
+[:mouse_move, 1218, 232, 2, 1800, 3278]
+[:mouse_move, 1220, 209, 2, 1801, 3279]
+[:mouse_move, 1221, 199, 2, 1802, 3280]
+[:mouse_move, 1221, 185, 2, 1803, 3281]
+[:mouse_move, 1221, 177, 2, 1804, 3282]
+[:mouse_move, 1221, 167, 2, 1805, 3283]
+[:mouse_move, 1221, 157, 2, 1806, 3284]
+[:mouse_move, 1220, 151, 2, 1807, 3285]
+[:mouse_move, 1214, 142, 2, 1808, 3286]
+[:mouse_move, 1210, 137, 2, 1809, 3287]
+[:mouse_move, 1200, 128, 2, 1810, 3288]
+[:mouse_move, 1194, 123, 2, 1811, 3289]
+[:mouse_move, 1182, 114, 2, 1812, 3290]
+[:mouse_move, 1169, 105, 2, 1813, 3291]
+[:mouse_move, 1153, 95, 2, 1814, 3292]
+[:mouse_move, 1145, 91, 2, 1815, 3293]
+[:mouse_move, 1133, 87, 2, 1816, 3294]
+[:mouse_move, 1125, 84, 2, 1817, 3295]
+[:mouse_move, 1109, 79, 2, 1818, 3296]
+[:mouse_move, 1101, 78, 2, 1819, 3297]
+[:mouse_move, 1080, 73, 2, 1820, 3298]
+[:mouse_move, 1071, 71, 2, 1821, 3299]
+[:mouse_move, 1059, 69, 2, 1822, 3300]
+[:mouse_move, 1052, 68, 2, 1823, 3301]
+[:mouse_move, 1044, 68, 2, 1824, 3302]
+[:mouse_move, 1040, 68, 2, 1825, 3303]
+[:mouse_move, 1030, 68, 2, 1826, 3304]
+[:mouse_move, 1027, 68, 2, 1827, 3305]
+[:mouse_move, 1021, 68, 2, 1828, 3306]
+[:mouse_move, 1017, 68, 2, 1829, 3307]
+[:mouse_move, 1010, 70, 2, 1830, 3308]
+[:mouse_move, 1005, 71, 2, 1831, 3309]
+[:mouse_move, 997, 74, 2, 1832, 3310]
+[:mouse_move, 992, 76, 2, 1833, 3311]
+[:mouse_move, 986, 78, 2, 1834, 3312]
+[:mouse_move, 969, 84, 2, 1835, 3313]
+[:mouse_move, 960, 87, 2, 1836, 3314]
+[:mouse_move, 943, 94, 2, 1837, 3315]
+[:mouse_move, 932, 99, 2, 1838, 3316]
+[:mouse_move, 918, 104, 2, 1839, 3317]
+[:mouse_move, 911, 107, 2, 1840, 3318]
+[:mouse_move, 898, 113, 2, 1841, 3319]
+[:mouse_move, 894, 116, 2, 1842, 3320]
+[:mouse_move, 884, 123, 2, 1843, 3321]
+[:mouse_move, 881, 126, 2, 1844, 3322]
+[:mouse_move, 873, 136, 2, 1845, 3323]
+[:mouse_move, 869, 141, 2, 1846, 3324]
+[:mouse_move, 864, 151, 2, 1847, 3325]
+[:mouse_move, 861, 157, 2, 1848, 3326]
+[:mouse_move, 855, 173, 2, 1849, 3327]
+[:mouse_move, 853, 180, 2, 1850, 3328]
+[:mouse_move, 850, 203, 2, 1851, 3329]
+[:mouse_move, 849, 215, 2, 1852, 3330]
+[:mouse_move, 848, 231, 2, 1853, 3331]
+[:mouse_move, 848, 234, 2, 1854, 3332]
+[:mouse_move, 848, 244, 2, 1855, 3333]
+[:mouse_move, 848, 246, 2, 1856, 3334]
+[:mouse_move, 848, 248, 2, 1857, 3335]
+[:mouse_move, 848, 232, 2, 1858, 3337]
+[:mouse_move, 848, 216, 2, 1859, 3338]
+[:mouse_move, 847, 186, 2, 1860, 3339]
+[:mouse_move, 846, 168, 2, 1861, 3340]
+[:mouse_move, 846, 161, 2, 1862, 3341]
+[:mouse_move, 846, 136, 2, 1863, 3342]
+[:mouse_move, 846, 126, 2, 1864, 3343]
+[:mouse_move, 846, 117, 2, 1865, 3344]
+[:mouse_move, 846, 113, 2, 1866, 3345]
+[:mouse_move, 846, 106, 2, 1867, 3346]
+[:mouse_move, 846, 101, 2, 1868, 3347]
+[:mouse_move, 846, 93, 2, 1869, 3348]
+[:mouse_move, 846, 90, 2, 1870, 3349]
+[:mouse_move, 846, 79, 2, 1871, 3350]
+[:mouse_move, 846, 73, 2, 1872, 3351]
+[:mouse_move, 846, 60, 2, 1873, 3352]
+[:mouse_move, 846, 54, 2, 1874, 3353]
+[:mouse_move, 846, 47, 2, 1875, 3354]
+[:mouse_move, 846, 44, 2, 1876, 3355]
+[:mouse_move, 845, 41, 2, 1877, 3356]
+[:mouse_move, 845, 39, 2, 1878, 3357]
+[:mouse_move, 843, 37, 2, 1879, 3358]
+[:mouse_move, 842, 36, 2, 1880, 3360]
+[:mouse_move, 841, 36, 2, 1881, 3361]
+[:mouse_move, 840, 35, 2, 1882, 3362]
+[:mouse_move, 839, 35, 2, 1883, 3363]
+[:mouse_move, 838, 34, 2, 1884, 3364]
+[:mouse_move, 837, 34, 2, 1885, 3367]
+[:mouse_move, 836, 33, 2, 1886, 3369]
+[:mouse_move, 835, 33, 2, 1887, 3372]
+[:mouse_move, 835, 32, 2, 1888, 3373]
+[:mouse_move, 835, 31, 2, 1889, 3378]
+[:mouse_move, 839, 31, 2, 1890, 3385]
+[:mouse_move, 843, 31, 2, 1891, 3386]
+[:mouse_move, 852, 31, 2, 1892, 3387]
+[:mouse_move, 858, 31, 2, 1893, 3388]
+[:mouse_move, 872, 30, 2, 1894, 3389]
+[:mouse_move, 879, 29, 2, 1895, 3390]
+[:mouse_move, 888, 29, 2, 1896, 3391]
+[:mouse_move, 892, 29, 2, 1897, 3392]
+[:mouse_move, 896, 28, 2, 1898, 3393]
+[:mouse_move, 901, 28, 2, 1899, 3394]
+[:mouse_move, 903, 28, 2, 1900, 3395]
+[:mouse_move, 905, 28, 2, 1901, 3396]
+[:mouse_move, 906, 28, 2, 1902, 3397]
+[:mouse_move, 909, 28, 2, 1903, 3398]
+[:mouse_move, 910, 28, 2, 1904, 3399]
+[:mouse_move, 913, 28, 2, 1905, 3400]
+[:mouse_move, 915, 28, 2, 1906, 3401]
+[:mouse_move, 918, 28, 2, 1907, 3402]
+[:mouse_move, 920, 28, 2, 1908, 3403]
+[:mouse_move, 924, 28, 2, 1909, 3404]
+[:mouse_move, 926, 28, 2, 1910, 3405]
+[:mouse_move, 932, 28, 2, 1911, 3406]
+[:mouse_move, 935, 28, 2, 1912, 3407]
+[:mouse_move, 941, 28, 2, 1913, 3408]
+[:mouse_move, 943, 28, 2, 1914, 3409]
+[:mouse_move, 949, 28, 2, 1915, 3410]
+[:mouse_move, 953, 28, 2, 1916, 3411]
+[:mouse_move, 958, 28, 2, 1917, 3412]
+[:mouse_move, 960, 28, 2, 1918, 3413]
+[:mouse_move, 964, 28, 2, 1919, 3414]
+[:mouse_move, 965, 28, 2, 1920, 3415]
+[:mouse_move, 966, 28, 2, 1921, 3416]
+[:mouse_move, 967, 28, 2, 1922, 3418]
+[:key_down_raw, 1073742051, 1024, 2, 1923, 3542]
+[:key_down_raw, 113, 1024, 2, 1924, 3542]
diff --git a/samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb b/samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb
new file mode 100644
index 0000000..aedd830
--- /dev/null
+++ b/samples/07_advanced_rendering/04_render_primitive_hierarchies/app/main.rb
@@ -0,0 +1,172 @@
+=begin
+
+ APIs listing that haven't been encountered in previous sample apps:
+
+ - Nested array: An array whose individual elements are also arrays; useful for
+ storing groups of similar data. Also called multidimensional arrays.
+
+ In this sample app, we see nested arrays being used in object definitions.
+ Notice the parameters for solids, listed below. Parameters 1-3 set the
+ definition for the rect, and parameter 4 sets the definition of the color.
+
+ Instead of having a solid definition that looks like this,
+ [X, Y, W, H, R, G, B]
+ we can separate it into two separate array definitions in one, like this
+ [[X, Y, W, H], [R, G, B]]
+ and both options work fine in defining our solid (or any object).
+
+ - Collections: Lists of data; useful for organizing large amounts of data.
+ One element of a collection could be an array (which itself contains many elements).
+ For example, a collection that stores two solid objects would look like this:
+ [
+ [100, 100, 50, 50, 0, 0, 0],
+ [100, 150, 50, 50, 255, 255, 255]
+ ]
+ If this collection was added to args.outputs.solids, two solids would be output
+ next to each other, one black and one white.
+ Nested arrays can be used in collections, as you will see in this sample app.
+
+ Reminders:
+
+ - args.outputs.solids: An array. The values generate a solid.
+ The parameters for a solid are
+ 1. The position on the screen (x, y)
+ 2. The width (w)
+ 3. The height (h)
+ 4. The color (r, g, b) (if a color is not assigned, the object's default color will be black)
+ NOTE: THE PARAMETERS ARE THE SAME FOR BORDERS!
+
+ Here is an example of a (red) border or solid definition:
+ [100, 100, 400, 500, 255, 0, 0]
+ It will be a solid or border depending on if it is added to args.outputs.solids or args.outputs.borders.
+ For more information about solids and borders, go to mygame/documentation/03-solids-and-borders.md.
+
+ - args.outputs.sprites: An array. The values generate a sprite.
+ The parameters for sprites are
+ 1. The position on the screen (x, y)
+ 2. The width (w)
+ 3. The height (h)
+ 4. The image path (p)
+
+ Here is an example of a sprite definition:
+ [100, 100, 400, 500, 'sprites/dragonruby.png']
+ For more information about sprites, go to mygame/documentation/05-sprites.md.
+
+=end
+
+# This code demonstrates the creation and output of objects like sprites, borders, and solids
+# If filled in, they are solids
+# If hollow, they are borders
+# If images, they are sprites
+
+# Solids are added to args.outputs.solids
+# Borders are added to args.outputs.borders
+# Sprites are added to args.outputs.sprites
+
+# The tick method runs 60 frames every second.
+# Your game is going to happen under this one function.
+def tick args
+ border_as_solid_and_solid_as_border args
+ sprite_as_border_or_solids args
+ collection_of_borders_and_solids args
+ collection_of_sprites args
+end
+
+# Shows a border being output onto the screen as a border and a solid
+# Also shows how colors can be set
+def border_as_solid_and_solid_as_border args
+ border = [0, 0, 50, 50]
+ args.outputs.borders << border
+ args.outputs.solids << border
+
+ # Red, green, blue saturations (last three parameters) can be any number between 0 and 255
+ border_with_color = [0, 100, 50, 50, 255, 0, 0]
+ args.outputs.borders << border_with_color
+ args.outputs.solids << border_with_color
+
+ border_with_nested_color = [0, 200, 50, 50, [0, 255, 0]] # nested color
+ args.outputs.borders << border_with_nested_color
+ args.outputs.solids << border_with_nested_color
+
+ border_with_nested_rect = [[0, 300, 50, 50], 0, 0, 255] # nested rect
+ args.outputs.borders << border_with_nested_rect
+ args.outputs.solids << border_with_nested_rect
+
+ border_with_nested_color_and_rect = [[0, 400, 50, 50], [255, 0, 255]] # nested rect and color
+ args.outputs.borders << border_with_nested_color_and_rect
+ args.outputs.solids << border_with_nested_color_and_rect
+end
+
+# Shows a sprite output onto the screen as a sprite, border, and solid
+# Demonstrates that all three outputs appear differently on screen
+def sprite_as_border_or_solids args
+ sprite = [100, 0, 50, 50, 'sprites/ship.png']
+ args.outputs.sprites << sprite
+
+ # Sprite_as_border variable has same parameters (excluding position) as above object,
+ # but will appear differently on screen because it is added to args.outputs.borders
+ sprite_as_border = [100, 100, 50, 50, 'sprites/ship.png']
+ args.outputs.borders << sprite_as_border
+
+ # Sprite_as_solid variable has same parameters (excluding position) as above object,
+ # but will appear differently on screen because it is added to args.outputs.solids
+ sprite_as_solid = [100, 200, 50, 50, 'sprites/ship.png']
+ args.outputs.solids << sprite_as_solid
+end
+
+# Holds and outputs a collection of borders and a collection of solids
+# Collections are created by using arrays to hold parameters of each individual object
+def collection_of_borders_and_solids args
+ collection_borders = [
+ [
+ [200, 0, 50, 50], # black border
+ [200, 100, 50, 50, 255, 0, 0], # red border
+ [200, 200, 50, 50, [0, 255, 0]], # nested color
+ ],
+ [[200, 300, 50, 50], 0, 0, 255], # nested rect
+ [[200, 400, 50, 50], [255, 0, 255]] # nested rect and nested color
+ ]
+
+ args.outputs.borders << collection_borders
+
+ collection_solids = [
+ [
+ [[300, 300, 50, 50], 0, 0, 255], # nested rect
+ [[300, 400, 50, 50], [255, 0, 255]] # nested rect and nested color
+ ],
+ [300, 0, 50, 50],
+ [300, 100, 50, 50, 255, 0, 0],
+ [300, 200, 50, 50, [0, 255, 0]], # nested color
+ ]
+
+ args.outputs.solids << collection_solids
+end
+
+# Holds and outputs a collection of sprites by adding it to args.outputs.sprites
+# Also outputs a collection with same parameters (excluding position) by adding
+# it to args.outputs.solids and another to args.outputs.borders
+def collection_of_sprites args
+ sprites_collection = [
+ [
+ [400, 0, 50, 50, 'sprites/ship.png'],
+ [400, 100, 50, 50, 'sprites/ship.png'],
+ ],
+ [400, 200, 50, 50, 'sprites/ship.png']
+ ]
+
+ args.outputs.sprites << sprites_collection
+
+ args.outputs.solids << [
+ [500, 0, 50, 50, 'sprites/ship.png'],
+ [500, 100, 50, 50, 'sprites/ship.png'],
+ [[[500, 200, 50, 50, 'sprites/ship.png']]]
+ ]
+
+ args.outputs.borders << [
+ [
+ [600, 0, 50, 50, 'sprites/ship.png'],
+ [600, 100, 50, 50, 'sprites/ship.png'],
+ ],
+ [600, 200, 50, 50, 'sprites/ship.png']
+ ]
+end
diff --git a/samples/07_advanced_rendering/04_render_primitive_hierarchies/license-for-sample.txt b/samples/07_advanced_rendering/04_render_primitive_hierarchies/license-for-sample.txt
new file mode 100644
index 0000000..100dcec
--- /dev/null
+++ b/samples/07_advanced_rendering/04_render_primitive_hierarchies/license-for-sample.txt
@@ -0,0 +1,9 @@
+Copyright 2019 DragonRuby LLC
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/samples/07_advanced_rendering/04_render_primitive_hierarchies/sprites/ship.png b/samples/07_advanced_rendering/04_render_primitive_hierarchies/sprites/ship.png
new file mode 100644
index 0000000..3ef5f0b
--- /dev/null
+++ b/samples/07_advanced_rendering/04_render_primitive_hierarchies/sprites/ship.png
Binary files differ
diff --git a/samples/07_advanced_rendering/11_render_primitives_as_hash/app/main.rb b/samples/07_advanced_rendering/11_render_primitives_as_hash/app/main.rb
new file mode 100644
index 0000000..f7e5bac
--- /dev/null
+++ b/samples/07_advanced_rendering/11_render_primitives_as_hash/app/main.rb
@@ -0,0 +1,191 @@
+=begin
+
+ Reminders:
+
+ - Hashes: Collection of unique keys and their corresponding values. The value can be found
+ using their keys.
+
+ For example, if we have a "numbers" hash that stores numbers in English as the
+ key and numbers in Spanish as the value, we'd have a hash that looks like this...
+ numbers = { "one" => "uno", "two" => "dos", "three" => "tres" }
+ and on it goes.
+
+ Now if we wanted to find the corresponding value of the "one" key, we could say
+ puts numbers["one"]
+ which would print "uno" to the console.
+
+ - args.outputs.sprites: An array. The values generate a sprite.
+ The parameters are [X, Y, WIDTH, HEIGHT, PATH, ANGLE, ALPHA, RED, GREEN, BLUE]
+ For more information about sprites, go to mygame/documentation/05-sprites.md.
+
+ - args.outputs.labels: An array. The values generate a label.
+ The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
+ For more information about labels, go to mygame/documentation/02-labels.md.
+
+ - args.outputs.solids: An array. The values generate a solid.
+ The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
+ For more information about solids, go to mygame/documentation/03-solids-and-borders.md.
+
+ - args.outputs.borders: An array. The values generate a border.
+ The parameters are the same as a solid.
+ For more information about borders, go to mygame/documentation/03-solids-and-borders.md.
+
+ - args.outputs.lines: An array. The values generate a line.
+ The parameters are [X1, Y1, X2, Y2, RED, GREEN, BLUE]
+ For more information about labels, go to mygame/documentation/02-labels.md.
+
+=end
+
+# This sample app demonstrates how hashes can be used to output different kinds of objects.
+
+def tick args
+ args.state.angle ||= 0 # initializes angle to 0
+ args.state.angle += 1 # increments angle by 1 every frame (60 times a second)
+
+ # Outputs sprite using a hash
+ args.outputs.sprites << {
+ x: 30, # sprite position
+ y: 550,
+ w: 128, # sprite size
+ h: 101,
+ path: "dragonruby.png", # image path
+ angle: args.state.angle, # angle
+ a: 255, # alpha (transparency)
+ r: 255, # color saturation
+ g: 255,
+ b: 255,
+ tile_x: 0, # sprite sub division/tile
+ tile_y: 0,
+ tile_w: -1,
+ tile_h: -1,
+ flip_vertically: false, # don't flip sprite
+ flip_horizontally: false,
+ angle_anchor_x: 0.5, # rotation center set to middle
+ angle_anchor_y: 0.5
+ }
+
+ # Outputs label using a hash
+ args.outputs.labels << {
+ x: 200, # label position
+ y: 550,
+ text: "dragonruby", # label text
+ size_enum: 2,
+ alignment_enum: 1,
+ r: 155, # color saturation
+ g: 50,
+ b: 50,
+ a: 255, # transparency
+ font: "fonts/manaspc.ttf" # font style; without mentioned file, label won't output correctly
+ }
+
+ # Outputs solid using a hash
+ # [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE, ALPHA]
+ args.outputs.solids << {
+ x: 400, # position
+ y: 550,
+ w: 160, # size
+ h: 90,
+ r: 120, # color saturation
+ g: 50,
+ b: 50,
+ a: 255 # transparency
+ }
+
+ # Outputs border using a hash
+ # Same parameters as a solid
+ args.outputs.borders << {
+ x: 600,
+ y: 550,
+ w: 160,
+ h: 90,
+ r: 120,
+ g: 50,
+ b: 50,
+ a: 255
+ }
+
+ # Outputs line using a hash
+ args.outputs.lines << {
+ x: 900, # starting position
+ y: 550,
+ x2: 1200, # ending position
+ y2: 550,
+ r: 120, # color saturation
+ g: 50,
+ b: 50,
+ a: 255 # transparency
+ }
+
+ # Outputs sprite as a primitive using a hash
+ args.outputs.primitives << {
+ x: 30, # position
+ y: 200,
+ w: 128, # size
+ h: 101,
+ path: "dragonruby.png", # image path
+ angle: args.state.angle, # angle
+ a: 255, # transparency
+ r: 255, # color saturation
+ g: 255,
+ b: 255,
+ tile_x: 0, # sprite sub division/tile
+ tile_y: 0,
+ tile_w: -1,
+ tile_h: -1,
+ flip_vertically: false, # don't flip
+ flip_horizontally: false,
+ angle_anchor_x: 0.5, # rotation center set to middle
+ angle_anchor_y: 0.5
+ }.sprite
+
+ # Outputs label as primitive using a hash
+ args.outputs.primitives << {
+ x: 200, # position
+ y: 200,
+ text: "dragonruby", # text
+ size: 2,
+ alignment: 1,
+ r: 155, # color saturation
+ g: 50,
+ b: 50,
+ a: 255, # transparency
+ font: "fonts/manaspc.ttf" # font style
+ }.label
+
+ # Outputs solid as primitive using a hash
+ args.outputs.primitives << {
+ x: 400, # position
+ y: 200,
+ w: 160, # size
+ h: 90,
+ r: 120, # color saturation
+ g: 50,
+ b: 50,
+ a: 255 # transparency
+ }.solid
+
+ # Outputs border as primitive using a hash
+ # Same parameters as solid
+ args.outputs.primitives << {
+ x: 600, # position
+ y: 200,
+ w: 160, # size
+ h: 90,
+ r: 120, # color saturation
+ g: 50,
+ b: 50,
+ a: 255 # transparency
+ }.border
+
+ # Outputs line as primitive using a hash
+ args.outputs.primitives << {
+ x: 900, # starting position
+ y: 200,
+ x2: 1200, # ending position
+ y2: 200,
+ r: 120, # color saturation
+ g: 50,
+ b: 50,
+ a: 255 # transparency
+ }.line
+end
diff --git a/samples/07_advanced_rendering/11_render_primitives_as_hash/fonts/manaspc.ttf b/samples/07_advanced_rendering/11_render_primitives_as_hash/fonts/manaspc.ttf
new file mode 100644
index 0000000..0c56733
--- /dev/null
+++ b/samples/07_advanced_rendering/11_render_primitives_as_hash/fonts/manaspc.ttf
Binary files differ
diff --git a/samples/07_advanced_rendering/11_render_primitives_as_hash/license-for-sample.txt b/samples/07_advanced_rendering/11_render_primitives_as_hash/license-for-sample.txt
new file mode 100644
index 0000000..100dcec
--- /dev/null
+++ b/samples/07_advanced_rendering/11_render_primitives_as_hash/license-for-sample.txt
@@ -0,0 +1,9 @@
+Copyright 2019 DragonRuby LLC
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.